Django ORM(Django 2.X)中`FilteredRelation()`对象的用法是什么?

问题描述 投票:1回答:1

我见过Django 2.0由queryset中的FilteredRelation对象组成。新推出的FilteredRelation有什么用?

What I've looked into?

我观察了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')

Main Question

现在显示我的问题是什么是FilteredRelation的用法以及何时在你的QuerySet中使用?

django django-models django-orm
1个回答
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子句中的过滤仅适用于素食比萨饼。


UPDATE

Django #29555票证有关于使用和性能的更多信息。 FilteredRelation()不仅可以提高性能,还可以在与多个LEFT JOINs聚合时产生正确的结果。

© www.soinside.com 2019 - 2024. All rights reserved.