Django根据ForeignKey集中的属性过滤对象

mic*_*mic 3 python django django-models

我有看起来像这样的模型:

class Type(models.Model):
    name = models.CharField(max_length=50)
    notes = models.CharField(max_length=50)

class Instance(models.Model):
    type = models.ForeignKey(Type, on_delete=models.CASCADE)
    color = models.CharField(max_length=50)
    quantity = models.PositiveIntegerField()
Run Code Online (Sandbox Code Playgroud)

我想所有的列表Type具有至少一个S Instance,其quantity大于0。我怎样才能表达?

在(伪)香草 Python 中,这将类似于:

[type for type in Type.objects.all()
       if type.instance_set.objects.filter(lambda instance: instance.quantity > 0)]
Run Code Online (Sandbox Code Playgroud)

我试过

available_types = Type.objects.filter(Q(instance_set__contains=Q(quantity__gt=0))
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为 Django 正在寻找quantity的属性Type,当然没有找到它,因为它是Instance.

Dan*_*man 5

您可以直接过滤关系:

Type.objects.filter(instance__quantity__gt=0)
Run Code Online (Sandbox Code Playgroud)

  • 没关系,Django知道要遵循关系。这会起作用。请参阅[跨越关系的查找](https://docs.djangoproject.com/en/2.2/topics/db/queries/#lookups-that-span-relationships)上的文档:'引用“反向”关系,只需使用型号的小写名称即可。 (2认同)