首页 > 解决方案 > Django ORM(Django 2.X)中“FilteredRelation()”对象的用途是什么?

问题描述

我见过 Django 2.0 包括FilteredRelation对象组成。新引进的有什么用FilteredRelation

我调查了什么?

我观察了Django 2.0 文档,但我无法理解这背后的想法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?

标签: djangodjango-modelsdjango-orm

解决方案


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

您可以在Method-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')

方法二

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


您将使用Method-1 获得更好的性能,因为第一个查询集的WHERE子句中的过滤只会对素食比萨饼起作用。


更新

Django #29555票证包含有关使用和性能的更多信息。不仅可以提高性能,而且在与多个 s 聚合时会产生正确

的结果。FilteredRelation()LEFT JOIN


推荐阅读