2012-06-20 2 views
2

Итак, я пытаюсь получить список самых популярных events на сколько attendees находится в каждом 'event'.Получить 'самый популярный' список в 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

Крис имеет правильный ответ. Обратите внимание, что вы также можете избежать создания пользовательского метода модели 'attendees', указав аргумент ключевого слова' related_name' в поле 'ForeignKey' в модели Attendee: https://docs.djangoproject.com/en/dev/topics/db/models/# inheritance-and-reverse-relations – twaddington

+1

Технически вам не нужно даже это делать, если вы можете использовать что-то вроде 'event_instance.attendee_set.all()', но да, если вы хотите, чтобы это быть «участниками», вам нужно указать это как 'related_name', а затем 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

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