Как снабдить все объекты новым свойством?

#python #django

#python #django

Вопрос:

 class Author(Model):
    state = models.CharField('ST')

class Essay(Model):
    authors = models.ManyToManyField("Author",
        through='EssayAuthor')

>> mylist 
[ <Essay: A1>, <Essay: B4>, <Essay: C9>, <Essay: A3> ... ]
  

mylist — это QuerySet .
Я хочу добавить другое свойство к каждому экземпляру Essay in mylist с state Author помощью (ов) . Предполагается, что состояния для книг с более чем одним автором эквивалентны. Таким образом, для эссе с 2 авторами не имеет значения, какой автор используется.

Таким образом, я хочу иметь возможность делать это:

 >> essay0 = mylist[0]
>> essay0.state 
'AK'
  

annotate Метод полезен только для числовых / плавающих значений; поэтому я не могу его использовать. Если я использую генератор для введения свойства, как я могу восстановить набор запросов?

Ответ №1:

Не могли бы вы просто сделать это в своем классе модели?

 class Essay(Model):
    authors = models.ManyToManyField("Author",
        through='EssayAuthor')

    @property
    def state(self):
        if self.authors.count():
            return self.authors[0].state
        else:
            return null
  

Я не думаю, что в этом случае вы можете аннотировать свой набор запросов «на лету», особенно с логикой «использовать только одного автора, если их несколько». Другим вариантом было бы использовать extra() для построения более сложного SQL-запроса для этих дополнительных данных.