2012-06-20 28 views
2

因此,我想通過多少個attendees在每個'event'中獲得最受歡迎events的列表。在Django中獲得'最受歡迎'名單

模式

class Event(models.Model): 
    heading = models.CharField(max_length=200) 
    sub_heading = models.CharField(max_length=200, null=True, blank=True) 
    url = models.CharField(max_length=200, null=True, blank=True) 
    description = models.TextField() 
    tags = models.ManyToManyField(Tag, null=True, blank=True) 
    date = models.DateTimeField() 
    created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 

    def attendees(self): 
     return Attendee.objects.filter(event=self) 

class Attendee(models.Model): 
    event = models.ForeignKey(Event) 
    content_type = models.ForeignKey(ContentType, related_name='event_attendee') 
    object_id = models.PositiveIntegerField() 
    profile = generic.GenericForeignKey('content_type', 'object_id') 

查看

def event(request, id): 
    ... 
    events = Events.objects.all() 
    attendees = Attendee.objects.filter(event__in=events).count() 
    if attendees > 50: 
     popular_events = Event.objects.filter(what should i filter by).annotate(attendees_count=Count('attendees')).order_by('-attendee_count') ??? 
    # I'm probably going about this the wrong way :\ 

我真的很感激一些洞察到這一點。我正在做的是不工作。如何獲得熱門事件的查詢?

+0

克里斯有正確的答案。請注意,您還可以通過在Attendee模型的ForeignKey字段上指定'related_name'關鍵字參數來避免創建自定義'參與者'模型方法:https://docs.djangoproject.com/zh-CN/dev/topics/db/models /#inheritance-and-reverse-relations – twaddington

+1

從技術上講,如果你可以使用類似'event_instance.attendee_set.all()'的東西,那麼你甚至不需要這樣做,但是,如果你想要的話你需要指定'related_name'作爲'attendees',然後OP可以使用'event_instance.attendees.all()'。 –

回答

5

使用annotations

from django.db.models import Count 

popular_events = Events.objects.annotate(attendee_count=Count('attendee')).filter(attendee_count__gt=50) 
+0

正是我需要的。謝謝。 – Modelesq