问题描述
我的模型:
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)
。问题是 you
是 Character
的实例,而不是可迭代的字符,因此它应该是 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))