Models:
class House(Model)
class Flat(Model):
house = ForeignKey(House, related_name="houses")
owner = ForeignKey(User)
class User(Model)
查询集:
queryset = User.objects.prefetch_related(
Prefetch("flats", queryset=Flat.objects.select_related("houses"))
然后平底:
{% for flat in user.flats.all %}
<p>№ {{ flat.number }}, {{ flat.house.name }}</p>
{% endfor %}
没事的。但是对于房子,我只需要独特的房子
{% for flat in user.flats.all %}
<p>House {{ flat.house.name }}</p>
{% endfor %}
但是这个模板给了我所有的房子,有重复的。 我怎样才能避免重复,任何想法?我尝试了 .distinct(),但它不起作用,看起来我使用错误 distinct() 等。
如果用户是多个flat
的owner
,您似乎最终可能会得到重复的房屋,这些房屋都在同一house
中。若要通过Flat
s 获取与用户相关的所有房屋,可以使用不同的查询,从House
开始,以便可以使用distinct
:
distinct_houses = House.objects.filter(flats__owner=user).distinct()
上面为用户是所有者的每个公寓返回一个 House 对象,并确保您没有重复项。(请注意,上面假设related_name
更改为flats
house = ForeignKey(House, related_name="flats")
,因为"房屋"作为related_name似乎是一个错字,与Flat
模型相关。
或者,如果你仍然需要通过原始queryset = User.objects.prefetch_related(...)
了解所有Flat
并且不需要额外的查询,你可以在 Python 中做一些事情。喜欢:
distinct_houses = {flat.house for flat in user.flats.all()}
旁注:看起来您需要使用Flat.objects.select_related('house')
而不是基于house
的外键字段名称Flat.objects.select_related('houses')
有错别字。
仅找到带有模板过滤器的解决方案。 查询集:
queryset = User.objects.filter(status="ACTIVE").prefetch_related(
Prefetch("flats", queryset=Flat.objects.select_related("house"))
)
有了这个,我可以为每个用户获得所有公寓:
{% for user in object_list %}
{% for flat in user.flats.all %}
{{ flat.number }}, {{ flat.house.name }}
{% endfor %}
{% endfor %}
我正在使用模板过滤器来获得独特的房屋。
{% for user in object_list %}
{% for flat in user.flats.all|get_unique_houses %}
{{ flat.house.name }}
{% endfor %}
{% endfor %}
# extra_tags.py
@register.filter(name="get_unique_houses")
def get_unique_houses(value):
return value.distinct('house')