2015-10-28 134 views
0

行爲我建立的一種關係one2many/many2one:odoo one2many像many2many

class dev_person(Model): 
    _name = "dev.person" 
    _description = "Person" 
    _columns = { 
     'name': fields.char('Person', size=128, required=True), 
     'properties': fields.many2one('dev.property', 'property_id', select=True), 
     } 

class dev_property(Model): 
    _name = "dev.property" 
    _description = "Property" 
    _columns = { 
     'name': fields.char('Property', size=128, required=True), 
     'property_id': fields.one2many('dev.person', 'properties'), 
     } 

我想一個dev_person記錄只能與一個dev_property掛鉤,但事實並非如此。我可以創建具有相同名稱和不同屬性的兩個人記錄,並且我不會這麼做......

回答

1

您的帖子很混亂。看看你的模型,一個dev_person記錄確實可以鏈接到只有一個dev_property。同時,您確實「能夠創建具有相同名稱和不同屬性的兩人記錄」 - 這與許多關係無關。如果你創建了兩個同名的人,他們仍然是兩個完全不同的對象dev_person。他們不是同一個人。當然,您可以將它們與不同的dev_property s鏈接起來。

如果要阻止此操作,請聲明name字段是唯一的。這樣,你將無法創建兩個同名的人(確保這確實是你想要的,因爲在現實生活中有不同的人具有相同的名字)。

class dev_person(Model): 
    _name = "dev.person" 
    _description = "Person" 
    _columns = { 
     'name': fields.char('Person', size=128, required=True), 
     'properties': fields.many2one('dev.property', 'property_id', select=True), 
     } 

    _sql_constraints = [ 
     (
      'dev_person_name_uniq', 
      'unique(name)', 
      "You can't have two people with the same name!", 
     ), 
    ] 
+0

我明白了你的觀點。這只是一個演示模塊,我正試圖弄清楚事情的工作方式。而不是名稱,它可能是ID_number,或者更有意義的東西......但是,我添加了這個約束,但是我仍然可以創建重複的名稱... – Urosh

+0

要點是,一個人不應該有兩個不同的屬性,禁用添加具有相同名稱和不同記錄的新記錄 – Urosh

+0

確保在更新模塊時已經沒有人名重複,否則唯一約束將失敗。 –

1

從你的問題我明白,你想要的人和財產。每個人都必須有一個財產。沒有兩個人可以有相同的名字。

混淆的部分是: -

  • 那你爲什麼要定義one2manydev.property參考 到dev.person

如果你的目的是要查看與此屬性相關的人員,您可以使用one2many功能字段。

對於這個請嘗試以下代碼: -

from openerp.osv import fields, osv 
class dev_person(osv.osv): 
_name = "dev.person" 
_description = "Person" 
_columns = { 
    'name': fields.char('Person', size=128, required=True), 
    'properties': fields.many2one('dev.property', 'property_id', select=True), 
    } 
_sql_constraints = [ 
    ('name_uniq','unique(name)', 'You cannot have two people with the same name !') 
    ] 


class dev_property(osv.osv): 
_name = "dev.property" 
_description = "Property" 
def _compute_persons(self, cr, uid, ids, name, args, context=None): 
    ''' This function will automatically computes the persons related to particular property.''' 
    result = {} 
    person_obj = self.pool.get('dev.person') 
    for person_data in self.browse(cr, uid, ids, context=context): 
     person_ids = person_obj.search(cr, uid, [('standard_id', '=', person_data.id)], context=context) 
     result[person_data.id] = person_ids 
    return result 
_columns = { 
    'name': fields.char('Property', size=128, required=True), 
    'person_ids': fields.function(_compute_persons, method=True, relation='dev.person', type="one2many", string='Persons'), 
    } 

希望這有助於。