Джанго подсчитывает связанные объекты в слое модели - PullRequest
1 голос
/ 11 мая 2011

Можно сделать что-то вроде этого:

class Book(models.Model):
    voters = models.ManyToManyField(User, blank=True)
    vote = models.IntegerField() # summary of all votes
    def average_vote(self):
        return int(vote/self.annotate(Count('voters')))

Ответы [ 2 ]

0 голосов
/ 11 мая 2011

Просто переопределите менеджер по умолчанию, чтобы он всегда возвращал аннотированный набор запросов:

class BookUserManager(models.Manager):
    def get_query_set(self, *args, **kwargs):
        return super(BookUserManager, self).get_query_set(*args, **kwargs).annotate(average_vote=models.Avg('books__vote'))

class BookUser(User):
    objects = BookUserManager()

    class Meta:
        proxy = True

class Book(models.Model):
    # Next line has been changed to use proxy model. This *will* affect the m2m table name.
    voters = models.ManyToManyField(BookUser, blank=True, related_name='books')
    vote = models.IntegerField() # summary of all votes

    objects = BookManager()

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

user = BookUser.objects.get(username='joe')
print user.average_vote

Обновление: Извините ... все неправильно поняли. Вот что я получаю за то, что читаю вопрос слишком быстро. На самом деле вам нужно аннотировать User, а не Book, но, поскольку User исходит от django.contrib.auth (я предполагаю), это невозможно, или, по крайней мере, требуется больше шагов. Код выше был обновлен.

0 голосов
/ 11 мая 2011

Может быть, что-то вроде этого?

class Book(models.Model):
    voters = models.ManyToManyField(User, blank=True)
    vote = models.IntegerField() # summary of all votes

    def average_vote(self):
        return int(self.vote/self.voters.all().count())

Дайте мне знать, если это работает.Я не проверял это.

...