По умолчанию заполнить One2many

Поэтому я пытаюсь заполнить список One2many по умолчанию. Я определил базовое поле, прочитал «специальные команды» для One2many и Many2many, но по какой-то причине оно не работает (нет сообщения об ошибке или чего-то еще, просто не заполняет его)

Мой код:

@api.one
def _get_competitions(self):
    result = []
    values = {'name': 'test', 'xx_price': 550, 'xx_seats_left': 50, 'xx_attending': True}
    result.append((0, 0, values))
    return result

xx_competitions_attendee = fields.One2many('xx.competition.attendee', 'xx_event_id', string="Competitions", default=_get_competitions)

Немного переработал, и теперь я просто возвращаю результат поиска, а список все равно не заполняется:

@api.model
def _get_competitions(self):
    return self.env['xx.competition.attendee'].search([('xx_event_id.id', '=', self._context.get('active_ids')[0])])

xx_competitions_attendee = fields.One2many('xx.competition.attendee', 'xx_event_id', string="Competitions", default=_get_competitions)

Я уже установил отношение Many2one в другой модели, я не думал, что это имеет большое значение, чтобы опубликовать его здесь, но чтобы быть уверенным:

class CompetitionAttendee(models.Model):
   _name = 'xx.competition.attendee'

   xx_event_id = fields.Many2one('event.event', string="Event")

person RandomPerson    schedule 09.01.2017    source источник
comment
Будете ли вы использовать отношение для этого one2many или вам нужно только показать его в форме?   -  person dccdany    schedule 09.01.2017


Ответы (1)


ПРИМЕЧАНИЕ:

@api.model
    def _get_competitions(self):
        result = []
        values = {'name': 'test', 'xx_price': 550, 'xx_seats_left': 50, 'xx_attending': True}
        result.append((0, 0, values))
        return result

В приведенном выше случае вы получите значения в списке One2many, потому что вы передаете значения в поле «xx_competitions_attendee».

@api.model
def _get_competitions(self):
    return self.env['xx.competition.attendee'].search([('xx_event_id.id', '=', self._context.get('active_ids')[0])])

Метод по умолчанию будет вызываться, когда вы собираетесь создать запись, поэтому в контексте нет никаких active_ids, поэтому словарь вернет None.

Таким образом, у вас может быть ошибка: TypeError: объект «NoneType» не имеет атрибута «getitem».

ПРИМЕЧАНИЕ:

Вам просто нужно установить ссылку many2one, пока вы чувствуете запись one2many. Поскольку поле One2many управляется самой структурой, и оно всегда создается по ссылке many2one, и вы не указали там ссылку Many2one.

values = {'many2one_field' : many2one_ref, 'name': 'test', 'xx_price': 550, 'xx_seats_left': 50, 'xx_attending': True,}

Вы должны попробовать следующее,

@api.model
def _get_competitions(self):
    result = []
    values = {'name': 'test', 'xx_price': 550, 'xx_seats_left': 50, 'xx_attending': True}
    result.append((0, 0, values))
    return result

Вы декорировали метод неправильным декоратором, чтобы установить значения по умолчанию, метод должен быть украшен @api.model (пустой набор записей), в то время как @api.one всегда требует набора записей для вызова метода.

Вы можете обратиться к документам Odoo, чтобы узнать больше о декораторах методов.

person Emipro Technologies Pvt. Ltd.    schedule 09.01.2017
comment
Я совсем забыл о декораторе. Я сейчас сделал запись в своей модели (из списка One2many). В моем методе по умолчанию я просто возвращаю результат поиска (отладил его и содержит записи). Так что в основном то же самое, что я упоминал в ОП, но список просто не заполняется. Я добавлю пример кода в OP - person RandomPerson; 09.01.2017
comment
Если возможно, обновите вопрос со структурой модели. - person Emipro Technologies Pvt. Ltd.; 09.01.2017
comment
Я обновил ответ, указав причину, по которой записей нет в One2many по умолчанию. Проверьте его, и если он не работает, обновите структуру модели в своем вопросе. - person Emipro Technologies Pvt. Ltd.; 09.01.2017
comment
Отношения уже были там, просто я не подумал, что это достаточно важно, чтобы опубликовать их, но я отредактировал OP, чтобы включить их. - person RandomPerson; 09.01.2017