Django ORM (Django 2.X) 中`FilteredRelation()` 对象的用法是什么?
What is the usage of `FilteredRelation()` objects in Django ORM (Django 2.X)?
我看到 Django 2.0 在查询集中包含 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')
主要问题
Show now my question is that what is usage of FilteredRelation
and when to use in your QuerySet
?
我认为文档本身不言自明。
您可以获得相同的结果,
方法一
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')
方法二
result_2 = Restaurant.objects.filter(pizzas__vegetarian=True, pizzas__name__icontains='mozzarella')
使用 Method-1 将获得更好的性能,因为第一个查询集的 WHERE 子句中的过滤将仅对素食比萨饼进行操作。
更新
Django #29555 票证有更多关于使用和性能的信息。
FilteredRelation()
不仅可以提高性能,还可以创建
与多个 LEFT JOIN
s.
聚合时结果正确
我看到 Django 2.0 在查询集中包含 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')
主要问题
Show now my question is that what is usage of
FilteredRelation
and when to use in yourQuerySet
?
我认为文档本身不言自明。
您可以获得相同的结果,
方法一
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')
方法二
result_2 = Restaurant.objects.filter(pizzas__vegetarian=True, pizzas__name__icontains='mozzarella')
使用 Method-1 将获得更好的性能,因为第一个查询集的 WHERE 子句中的过滤将仅对素食比萨饼进行操作。
更新
Django #29555 票证有更多关于使用和性能的信息。
FilteredRelation()
不仅可以提高性能,还可以创建
与多个 LEFT JOIN
s.