Django querysets.如何仅预取唯一?



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() 等。

如果用户是多个flatowner,您似乎最终可能会得到重复的房屋,这些房屋都在同一house中。若要通过Flats 获取与用户相关的所有房屋,可以使用不同的查询,从House开始,以便可以使用distinct

distinct_houses = House.objects.filter(flats__owner=user).distinct()

上面为用户是所有者的每个公寓返回一个 House 对象,并确保您没有重复项。(请注意,上面假设related_name更改为flatshouse = 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')

最新更新