在Django ORM(Django 2.X)中,FilteredRelation()对象的用途是什么?

时间:2019-03-28 06:13:45

标签: django django-models django-orm

我已经看到Django 2.0由queryset中的FilteredRelation对象组成。新引入的FilteredRelation的用途是什么?

我调查了什么?

我观察了Django 2.0 Documentation,但我不理解这个FilteredRelation对象背后的想法。

我研究了以下代码。但是我不明白。

>>> from django.db.models import FilteredRelation, Q
>>> Restaurant.objects.annotate(
...    pizzas_vegetarian=FilteredRelation(
...        'pizzas', condition=Q(pizzas__vegetarian=True),
...    ),
... ).filter(pizzas_vegetarian__name__icontains='mozzarella')

主要问题

  

现在显示我的问题是FilteredRelation的用法是什么?什么时候在您的QuerySet中使用?

1 个答案:

答案 0 :(得分:4)

我认为文档本身是不言自明的。

您可以在相同的结果中实现,
方法1

from django.db.models import FilteredRelation, Q

result_1 = Restaurant.objects.annotate(pizzas_vegetarian=FilteredRelation('pizzas', condition=Q(pizzas__vegetarian=True), ), ).filter(
    pizzas_vegetarian__name__icontains='mozzarella')

方法2

result_2 = Restaurant.objects.filter(pizzas__vegetarian=True, pizzas__name__icontains='mozzarella')


使用 Method-1 可获得更好的性能,因为第一个查询集的 WHERE 子句中的过滤将仅对素食比萨有效。


更新

Django #29555票证包含有关用法和性能的更多信息。

FilteredRelation() 不仅可以提高性能,还可以创建         与多个LEFT JOIN进行聚合时,结果正确。