2010-05-04 3 views
7

Учитывая эти две модели:Джанго Aggregation Через обратную связь

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. Прежде чем я это сделаю, есть ли способ сделать это из модели профиля? ProfileViews связаны через поле ForeignKey, но это не так, как будто модель Profile знает об этом, поэтому я не уверен, как связать их вместе.

Как в стороне, я понимаю, что могу просто хранить представления как свойство в модели профиля, и это может оказаться тем, что я здесь делаю, но мне все еще интересно узнать, как лучше использовать функции агрегирования.

ответ

9

ProfileViews связаны через ForeignKey поле, но это не так, хотя модель профиля знает, что

модель профиля на самом деле знает, что. Вы должны быть в состоянии сделать что-то вроде:

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

+0

'from django.db.models import Count' – juanjo

3

Конечно, это будет работать:

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

As Ботондс говорит, что модель профиля знает о отсталых отношениях ForeignKey.

Смежные вопросы