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_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!",
),
]
从你的问题我明白了,你想要的人和属性。而且每个人都必须拥有一个属性。没有两个人可以有相同的名字。
令人困惑的部分是:-
- 那你为什么要在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'),
}
希望对您有所帮助。
我创建了一个关系 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_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!",
),
]
从你的问题我明白了,你想要的人和属性。而且每个人都必须拥有一个属性。没有两个人可以有相同的名字。
令人困惑的部分是:-
- 那你为什么要在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'),
}
希望对您有所帮助。