Как аннотировать все объекты новым свойством? - PullRequest
0 голосов
/ 13 октября 2011
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> ... ]

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

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

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

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

1 Ответ

1 голос
/ 13 октября 2011

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

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 для этих дополнительных данных.

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