Django:如何使用来自父查询集的注释?
Django: How to use an annotation from a parent queryset?
我有一个 Item
class 可以使用自定义查询集 add_is_favorite_for
方法进行注释:
class ItemQuerySet(QuerySet):
def add_is_favorite_for(self, user):
"""add a boolean to know if the item is favorited by the given user"""
condition = Q(id__in=Item.objects.filter(favoriters=user).values("id"))
return self.annotate(is_favorite=Condition(condition)) # True or False
class Item(Model):
objects = Manager.from_queryset(ItemQuerySet)()
它按预期工作。例如:
>>> user = User.objects.get(id=1)
>>> Item.objects.add_is_favorite_for(user) # each item has now a `is_favorite` field
然后,我使用 1->N 关系添加了一个 Factory
模型和 link Item
模型:
class Factory(Model):
pass # ...
class Item(Model):
objects = Manager.from_queryset(ItemQuerySet)()
advised_in = models.ForeignKey(
Factory,
on_delete=models.CASCADE,
related_name="advised_items",
)
现在,我希望能够 return 一个 Factory
查询集,其 advised_items
字段也将全部包含 is_favorite
注释。
我不知道该怎么做,我在文档中没有看到这样的例子,也许我错过了。
您可以使用 Prefetch
object [Django-doc]:
from django.db.models import <strong>Prefetch</strong>
Factory.objects.prefetch_related(
<strong>Prefetch(</strong>'advised_items', queryset=Item.objects.add_is_favorite_for(<em>some_user</em>)<strong>)</strong>
)
我有一个 Item
class 可以使用自定义查询集 add_is_favorite_for
方法进行注释:
class ItemQuerySet(QuerySet):
def add_is_favorite_for(self, user):
"""add a boolean to know if the item is favorited by the given user"""
condition = Q(id__in=Item.objects.filter(favoriters=user).values("id"))
return self.annotate(is_favorite=Condition(condition)) # True or False
class Item(Model):
objects = Manager.from_queryset(ItemQuerySet)()
它按预期工作。例如:
>>> user = User.objects.get(id=1)
>>> Item.objects.add_is_favorite_for(user) # each item has now a `is_favorite` field
然后,我使用 1->N 关系添加了一个 Factory
模型和 link Item
模型:
class Factory(Model):
pass # ...
class Item(Model):
objects = Manager.from_queryset(ItemQuerySet)()
advised_in = models.ForeignKey(
Factory,
on_delete=models.CASCADE,
related_name="advised_items",
)
现在,我希望能够 return 一个 Factory
查询集,其 advised_items
字段也将全部包含 is_favorite
注释。
我不知道该怎么做,我在文档中没有看到这样的例子,也许我错过了。
您可以使用 Prefetch
object [Django-doc]:
from django.db.models import <strong>Prefetch</strong>
Factory.objects.prefetch_related(
<strong>Prefetch(</strong>'advised_items', queryset=Item.objects.add_is_favorite_for(<em>some_user</em>)<strong>)</strong>
)