Учитывая эти две модели:
class Profile(models.Model):
user = models.ForeignKey(User, unique=True, verbose_name=_('user'))
about = models.TextField(_('about'), blank=True)
zip = models.CharField(max_length=10, verbose_name='zip code', blank=True)
website = models.URLField(_('website'), blank=True, verify_exists=False)
class ProfileView(models.Model):
profile = models.ForeignKey(Profile)
viewer = models.ForeignKey(User, blank=True, null=True)
created = models.DateTimeField(auto_now_add=True)
Я хочу получить все профили, отсортированные по общим представлениям. Я могу получить список идентификаторов профиля, отсортированных по общим представлениям с:
ProfileView.objects.values('profile').annotate(Count('profile')).order_by('-profile__count')
Но это - просто словарь идентификаторов профиля, что означает, что я затем должен циклично выполниться по нему и соединить список объектов профиля. Который является многими дополнительными запросами и все еще не приводит к QuerySet. В той точке я мог бы также опуститься до необработанного SQL. Прежде чем я сделаю, там способ сделать это из модели Profile? ProfileViews связаны через поле ForeignKey, но это не, как будто модель Profile знает, что, таким образом, я не уверен, как связать два.
Как в стороне, я понимаю, что мог просто сохранить представления как свойство на модели Profile, и это может оказаться тем, что я делаю здесь, но я все еще интересуюсь изучением, как лучше использовать функции Агрегирования.
ProfileViews связаны через поле ForeignKey, но это не значит, что модель Profile знает, что
Модель Profile действительно знает это. Вы должны иметь возможность делать что-то вроде:
Profile.objects.all().annotate(count_views=Count('profileview__pk')).order_by('count_views')
Edit : Здесь вы можете найти документы Django о поисках, охватывающих отношения http://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships
Конечно, это сработает:
Profile.objects.all().annotate(viewcount=Count('profileview')).order_by('-viewcount')
Как говорит Ботондус, модель профиля знает об обратной связи ForeignKey.