繁体   English   中英

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

然后,我添加了一个Factory model 并使用 1->N 关系将Item model 链接到它:

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",
    )

现在,我希望能够返回一个Factory QuerySet,它的advised_items字段也都将包含is_favorite注释。 我不知道该怎么做,我在文档中没有看到这样的例子,也许我错过了。

您可以使用Prefetch object [Django-doc]

from django.db.models import Prefetch

Factory.objects.prefetch_related(
    Prefetch('advised_items', queryset=Item.objects.add_is_favorite_for(some_user))
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM