Django 注释相关领域的存在

Django annotate existance in related field

我的模特:

class Character(models.Model):
    name = models.CharField(max_length=100)

class Item(models.Model):
    name = models.CharField(max_length=100)

class Equipment(models.Model):
    owner = models.ForeignKey(Character, on_delete = models.CASCADE)
    item = models.ForeignKey(Item, on_delete = models.RESTRICT)

现在我需要注释物品是否在设备中:

 you = Character.objects.get(pk=1)
 items = Item.objects.all().annotate(ready=Value(True, output_field=models.BooleanField()), filter=Q(equipment__owner__in=you))

但出了点问题:

TypeError: 'Character' object is not iterable

你尝试注释并拥有这个filter=Q(equipment__owner__in=you)。问题是 youCharacter 的一个实例,不是字符的可迭代对象,所以它应该是 filter=Q(equipment__owner=you)。这仍然是不正确的,因为您不能以这种方式在注释内部进行过滤。

要注释相关字段的存在,请使用 Exists() subqueries [Django docs]:

from django.db.models import Exists, OuterRef

you = Character.objects.get(pk=1)
equipments = Equipment.objects.filter(item=OuterRef('pk'), owner=you)
Item.objects.annotate(ready=Exists(equipments))