我正在尝试注释外键关系,然后然后在循环中使用新的注释字段
>>> 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 可以吗? 我应该用什么方法来获取它?
Restaurant
对象上创建属性,这用于在
QuerySet
中进行进一步的过滤、注释等。这里您需要的是一个 对象[Django-doc],它可以填充过滤后的内容中的关系:
from django.db.models import Prefetch
Restaurant.objects.prefetch_related(
Prefetch(
'pizzas',
Pizza.objects.filter(vegitarian=True),
to_attr='pizzas_vegetarian',
)
)