Django 注释相关领域的存在

问题描述

我的模型:

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