Агрегирование Django через обратные отношения

Учитывая эти две модели:

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, и это может оказаться тем, что я делаю здесь, но я все еще интересуюсь изучением, как лучше использовать функции Агрегирования.

9
задан Tom 4 May 2010 в 15:11
поделиться

2 ответа

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

11
ответ дан 4 December 2019 в 13:46
поделиться

Конечно, это сработает:

Profile.objects.all().annotate(viewcount=Count('profileview')).order_by('-viewcount')

Как говорит Ботондус, модель профиля знает об обратной связи ForeignKey.

4
ответ дан 4 December 2019 в 13:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: