Как правильно рассчитать цикл For в python, odoo? - PullRequest
0 голосов
/ 14 ноября 2018

Существуют книжные записи разных жанров, и эта функция учитывает только один из них. Как я могу сделать так, чтобы он учитывал все жанры?

Функция:

@api.multi
def _total_count(self):

    for genre in self:
        if genre.name:
            count_num = 0
            ids = self.env['books.books'].search([('genre_ids', '=', genre.name)])
            if ids:
                count_num += 1
                genre.count = count_num

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Если у вас есть вычислительное поле count в gender model и вы хотите установить его значение автоматически при добавлении книги к этому полу, вы можете сделать что-то вроде этого:

  1. Сначала яЯ предполагаю, что gender_ids - это поле many2many в вашей книге, давайте предположим, что оно определено так:
           gender_ids = fields.Many2many(co_model='gender.model.name',
                                         relation='book_gender_rel',
                                         column1='book_id',
                                         column2='gender_id')
, поэтому вам нужно создать одно и то же поле many2many в вашем поле, я имею в виду, что поле должно иметь одинаковые имена полей и одинаковое имя отношения только с небольшими изменениями значений column1 and column2, например:
       book_ids = fields.Many2many(co_model='book.book',
                                   relation='book_gender_rel',
                                   column1='gender_id',
                                   column2='book_id')
сделайте ваше поле count вычислительным полем, подобным этому, лучше добавить store=True, если вычислительная нагрузка велика, и вы не хотите тратить много времени просто на отображение записей полов в представлении (специальное деревоview).
       # I renamed the field just to be more readable for others.
       count_book = fields.Integer(string='Number of books',
                                   compute='count_number_of_books',
                                   store=True,
                                   help='Contains number of book that belong to this gender')


       @api.depends('book_ids')
       def count_number_of_books(self):
           """ Count number of books that belong to this gender."""
           for gender in self:
               gender.count_book = len(gender.book_ids)

И таким образом вы можете использовать count_book в своих отчетах или в любом другом месте, не беспокоясь о его вычислении, потому что Odoo позаботится об этом.

0 голосов
/ 14 ноября 2018

Вам нужно где-то хранить результаты. Вот как это сделать с помощью словаря Python по названию жанра:

def _total_count(self):
    total_per_genre = {}
    for genre in self:
        if genre.name:
            count_num = 0
            ids = self.env['books.books'].search([('genre_ids', '=', genre.name)])
            if ids:
                count_num += 1
                genre.count = count_num
            total_per_genre[genre.name] = len(list(ids))
     print(total_per_genre)
     return total_per_genre

Редактировать: я неправильно понял вопрос. Я думаю, len(ids) - это то, что вам нужно (я использовал len(list(ids)), потому что я не уверен насчет типа ids. Обратите внимание, что я не знаю odoo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...