我似乎无法找到一种方法来限制在对象上应用过滤器时返回的多对多元素。如果有人能提供帮助,我将不胜感激。
假设我有以下模型:
## models.py
class Address(models.Model):
street = models.CharField(max_length=128)
city = models.CharField(max_length=128)
state_province = models.CharField(max_length=128)
zipcode = models.CharField(max_length=5)
country = models.CharField(max_length=128)
class Venue(models.Model):
address = models.ForeignKey(Address)
phone_number = models.CharField(max_length=10)
class Event(models.Model):
name = models.CharField(max_length=200)
description = models.TextField()
venues = models.ManyToManyField(Venue)
现在,如果我有一个活动将在两个场地进行,一个活动将在一个场地进行,如下所示(为说明目的而简化):
e1 = Event1
e2 = Event2
v1 = Venue1
v2 = Venue2
e1.venues.add(v1,v2)
e2.venues.add(v1)
我想生成一个查询集,它将带回在“Venue1”发生的所有事件,只有“Venue1”作为这些事件的返回地点。
我努力了
event_list = Event.objects.filter(venues__address__city='CityVenue1')
但是 event_list[0].venues.all()
返回“Venue1”和“Venue2”。
我的偏好是:
- 过滤视图中的 Event 对象而不是 Venue 对象。
- 出于性能原因,不要通过模板中的标签/过滤器应用任何逻辑并将其留给视图以返回所需的查询集。
我的模板遍历事件列表如下:
{% for event in event_list %}
<p>event.name
{% for venue in event.venues.all %}
at {{ venue.address.city }}
{% endfor %}
</p>
{% endfor %}
我希望它返回:
Event1 at CityVenue1
Event2 at CityVenue1
但目前我得到
Event1 at CityVenue1
at CityVenue2
Event2 at CityVenue1
在此先感谢您的帮助。