odoo one2many 表现得像 many2many

odoo one2many acts like many2many

我创建了一个关系 one2many/many2one:

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 链接,但事实并非如此。我能够创建两个具有相同名称和不同 属性 的个人记录,但我不会这样做...

您的 post 令人困惑。查看您的模型,一条 dev_person 条记录确实可以 link 只用一条 dev_property 编辑。同时你确实是 "able to create two person records with the same name and different property" - 这与 many2one 关系无关。如果你创建两个同名的人,他们仍然是两个完全不同的 dev_person 对象。他们不是同一个人。当然,您可以 link 它们具有不同的 dev_propertys。

如果要阻止此操作,请声明 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!",
        ),
    ]

从你的问题我明白了,你想要的人和属性。而且每个人都必须拥有一个属性。没有两个人可以有相同的名字。

令人困惑的部分是:-

  • 那你为什么要在dev.property中定义one2many字段并引用 至 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'),
   }

希望对您有所帮助。