user3449833
user3449833

Reputation: 809

Django query objects that have results in another table

models.py

class Event(models.Model):
    name = models.CharField(max_length=100)
    date = models.DateField()

class Result(models.Model):
    event = models.ForeignKey(Event)
    place = models.IntegerField()
    person = models.CharField(max_length=100)
    gender = models.CharField(max_length=1)
    score = models.IntegerField()

Event sample data:

id, name, date
1, 'event1', '2015-01-01'
2, 'event2', '2015-02-01'
3, 'event3', '2015-03-01'

Result sample data:

event_id, place, person, gender, score
1, 1, 'al', 'M', 25
1, 2, 'bob', 'M', 22
1, 3, 'cindy', 'F', 21
1, 4, 'doug', 'M', 20
2, 1, 'elen', 'F', 30
2, 2, 'frank', 'M', 28
2, 3, 'gord', 'M', 20
2, 4, 'helen', 'F', 19

I would like to select all the objects from Event where there is at least one result in Result for that event.

How I'm doing it now:

events = Event.objects.all().order_by('-date')
eventswithresults = []    
for event in events:
    count = Result.objects.filter(event_id=event).count()
    if count > 0:
        eventwithresults.append(event)

There must be a djangoier way.

Upvotes: 0

Views: 224

Answers (1)

Anush Devendra
Anush Devendra

Reputation: 5475

you can do like:

from django.db.models import Count
events = Event.objects.annotate(num_eve=Count('result')).filter(num_eve__gte=1)

Upvotes: 4

Related Questions