У меня есть два набора данных, которые демонстрируют отношение один к одному.
Я не могу объединить два набора данных, потому что:
- Отдельные записи могут присутствовать только в наборе А, только в наборе В или и в наборе А, и в наборе В; а также
- Связь между записями в наборе A и наборе B является временной, т. е. записи могут быть связаны и разъединены; а также
- Данные в наборе A обрабатываются иначе, чем данные в наборе B; а также
- Существуют внешние архитектурные ограничения.
Когда запись в наборе A связана с записью в наборе B, я хочу связать две записи. Когда записи связаны, связь должна быть взаимно однозначной. Как я могу гарантировать, что отношение является отношением "один к одному"?
Следующий код кажется близким, но я новичок в работе с Odoo и не знаю, как проанализировать, гарантирует ли этот подход отношение один к одному.
import openerp
class A(openerp.models.Model):
_name = 'set.a'
_sql_constraints = [
('set_b_id', 'unique("set_b_id")', 'Field set_b_id must be unique.'),
]
# Constrained to be unique (see SQL above) which essentially changes
# this end of the Many2one relationship to a One2one relationship. (The
# other end of the relationship must also be constrained.)
set_b_id = openerp.fields.Many2one(
comodel_name='set.b',
)
class B(openerp.models.Model):
_name = 'set.b'
# Constrained to tie with either zero keys or one key (see function
# below) which essentially changes this end of the One2many
# relationship to a One2one relationship. (The other end of the
# relationship must also be constrained.)
set_a_id = openerp.fields.One2many(
comodel_name='set.a',
inverse_name='set_b_id',
)
@openerp.api.constrains('set_a_id')
def _constrains_set_a_id(self):
if len(self.set_a_id) > 1:
raise openerp.exceptions.ValidationError('Additional linkage failed.')
Другой подход может заключаться в расширении openerp.fields для воссоздания ранее устаревшего отношения One2one, но я не уверен, что это можно сделать чисто.