2015-04-01 3 views
0

У меня есть следующий стол в Odoo, названный отношением, который исходит из отношения между столом девушки и мальчиком стола:Как установить этот конкретный домен на OpenERP/Odoo?

| girl_id | boy_id | relationship_type |

| 1 | 2 | друзья |

| 1 | 3 | братья и сестры |

| 2 | 7 | любители |

Итак:

  • В таблице девушки есть поле отношений, которое является one2many указывает на отношения таблицы.
  • В настольном мальчике есть полевые отношения, которое является одним большим числом , указывая на отношение таблицы.
  • В таблице соотношение есть два поля, girl_id и boy_id, оба указывающие на таблицы девушка и мальчик соответственно.

Сценарий:

В формах мальчика и девочки есть полевые отношения. Когда я добавляю новые отношения для девочки или мальчика, открывается форма для заполнения полей отношения таблицы (girl_id, boy_id и relationship_type). Представьте, что я в форме девушки, я нажимаю на добавление новых отношений и форма открывается. Я реализовал это, чтобы не видеть girl_id (он невидим, но содержит идентификатор текущей девушки). Поэтому я вижу только два поля (boy_id и relationship_type).

Что я хочу:

Продолжая с примером, если я открываю выпадающий boy_id, я буду видеть все мальчик, даже те, кто уже связанные с этой девушкой. Например, если я добавляю отношения к девушке с идентификатором 1, я не должен видеть мальчиков с идентификаторами 2 и 3, если девушка такая, у которой есть id 2, я не должен видеть мальчика с идентификатором 7.

Моя попытка

Я создал два поля в отношениях таблицы, названный boys_of_the_girl (one2many, связанные с 'girl_id.relationships') и girls_of_the_boy (one2many, связанные с 'boy_id.relationships').

Мой код: (Пример: создание отношений для девушки)

<field name="girl_id" invisible="1"/> 
<field name="boys_of_the_girl" invisible="1"/> 
<field name="boy_id" domain="[('id', 'not in', boys_of_the_girl)]"/> 
<field name="relationship_type"/> 

Ошибка:

RuntimeError: максимальная глубина рекурсии превышена при вызове объекта Python

Может ли кто-нибудь помочь мне, пожалуйста? Спасибо!

EDIT

Таблица мальчик

relationships = fields.One2many(comodel_name='relationship', 
           inverse_name='boy_id', 
           string='Relationships') 

Таблица девушка

relationships = fields.One2many(comodel_name='relationship', inverse_name='girl_id', string='Relationships') 

T возможность отношения

boy_id = fields.Many2one(comodel_name='boy', string='Boy', required=True) 
girl_id = fields.Many2one(comodel_name='girl', string='Girl', required=True) 
relationship_type = fields.Char(string='Relationship type') 
+0

Думаю, вам нужно взять many2many вместо one2many, а m2m default предоставляет то, что вы хотите. –

+0

Спасибо @EmiproTechnologies. Но поле many2many генерирует таблицу с только внешними идентификаторами, невозможно добавить к ней больше столбцов (например, relationship_type) – forvas

+0

Можете ли вы показать мне структуру полей всех этих моделей?. –

ответ

1

Ну, наконец-то я узнал, что это не возможно, чтобы справиться с этим с помощью кода XML, но это можно достичь той же цели с помощью Python:

только с помощью этой функции (и еще один аналогичный для домена girl_id в другой форме):

@api.onchange('girl_id') 
def on_change_girl_id(self): 
    current_girl_id = self.env.context.get('default_girl_id', False) 
    relationship_recordset = self.search([('girl_id', '=', current_girl_id)]) 
    boy_recordset = relationship_recordset.mapped('boy_id') 
    boy_ids = boy_recordset.mapped('id') 
    boy_id_domain = [ 
     ('id', 'not in', boy_ids) 
    ] 
    result = { 
     'domain': { 
      'boy_id': boy_id_domain, 
     }, 
    } 
    return result 

и так он не нужно добавлять какой-либо домен в поле boy_id в форме XML. Эта функция будет влиять на форму, в которой вы устанавливаете отношения для девушки, как я писал выше, должна быть объявлена ​​другая аналогичная функция для управления правильным поведением при установлении отношений для мальчика.

Смежные вопросы