Просто переопределите менеджер по умолчанию, чтобы он всегда возвращал аннотированный набор запросов:
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
(я предполагаю), это невозможно, или, по крайней мере, требуется больше шагов. Код выше был обновлен.