【问题标题】:What is the usage of `FilteredRelation()` objects in Django ORM (Django 2.X)?Django ORM(Django 2.X)中“FilteredRelation()”对象的用途是什么?
【发布时间】:2019-08-18 20:17:11
【问题描述】:

我已经看到 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')

主要问题

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

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

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

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

    方法2

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


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


    更新

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

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

    【讨论】:

    • 两个查询是否返回相同的结果?
    • 是的。但是,你不能总是使用FilteredRelation,因为它有一些限制。 (在文档的 FilteredRelation 不支持部分指定)
    • 我应该在条件内使用 F('field_name')
    • 不,因为F() 对象代表模型字段或注释列的值。
    猜你喜欢
    • 2015-12-24
    • 2020-07-29
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多