Given these two models:
class Event(models.Model):
title = models.CharField(max_length=200)
class dateEvent(models.Model):
venue = models.ForeignKey(Venue, on_delete=models.CASCADE,null=True, blank=True)
event = models.ForeignKey('Event', on_delete=models.CASCADE)
class Venue(models.Model):
venue_name = models.CharField(max_length=50)
How can I filter only the venues that appear in a dateEvent
? And how can I get the Event
details linked to a specific venue?
Right now I attempted this, which returns noniterable
and non exists
error:
venues = list(Venue.objects.filter(dateevent__venue.icontains=id).values('venue_name', 'dateevent__event.id')
You can .filter(…)
[Django-doc] with:
Venue.objects.filter(dateevent__isnull=False).prefetch_related('dateevent_set').distinct()
the .distinct()
call [Django-doc] prevents returning the same Venue
multiple times.
For the Venues
s you can access the .dateevent_set.all()
to retrieve all the related dateEvent
s.
Since the dateEvent
acts as a many-to-many relation, you can span one over this model with:
class Event(models.Model):
title = models.CharField(max_length=200)
class dateEvent(models.Model):
venue = models.ForeignKey(
Venue, on_delete=models.CASCADE, null=True, blank=True
)
event = models.ForeignKey('Event', on_delete=models.CASCADE)
class Venue(models.Model):
venue_name = models.CharField(max_length=50)
events = models.ManyToManyField(
Event, through='dateEvent', realted_name='venues'
)
then fetching the Event
s is even simpler:
qs = Venue.objects.filter(dateevent__isnull=False).prefetch_related(
'events'
).distinct()
you then enumerate over the .events.all()
of the Venue
, so:
for venue in qs:
print(venue.venue_name)
for event in venue.events.all():
print(f' - {event.title}')
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments