如何在Django中注释、过滤然后获取ForeignKey字段关系(FilteredRelation或其他方法)?

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

我正在尝试注释外键关系,然后然后在循环中使用新的注释字段

来自文档:

>>> 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")
这有效。
但如果我这样做:

>>> from django.db.models import FilteredRelation, Q >>> rests = Restaurant.objects.annotate( ... pizzas_vegetarian=FilteredRelation( ... "pizzas", ... condition=Q(pizzas__vegetarian=True), ... ) ... ) ... for rest in rests: print(rest.pizzas_vegetarian)
我收到 AttributeError: 

“餐厅对象没有属性‘pizzas_vegetarian’”

我需要在单独的代码块中访问“pizzas_vegetarian”。 FilteredRelation 可以吗? 我应该用什么方法来获取它?

python django orm
1个回答
0
投票

.annotate(…)

 [Django-doc]不会在Restaurant
对象上创建属性,这用于在
QuerySet
中进行进一步的过滤、注释等。

这里您需要的是一个

Prefetch

 对象[Django-doc],它可以填充过滤后的内容中的关系:

from django.db.models import Prefetch Restaurant.objects.prefetch_related( Prefetch( 'pizzas', Pizza.objects.filter(vegitarian=True), to_attr='pizzas_vegetarian', ) )
    
© www.soinside.com 2019 - 2024. All rights reserved.