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

时间:2019-07-24 20:16:09

标签: 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()

我想获取所有Type的列表,这些列表至少具有一个Instance大于0的quantity。我该如何表达呢?

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

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

我尝试过

available_types = Type.objects.filter(Q(instance_set__contains=Q(quantity__gt=0))

但是这不起作用,因为Django正在将quantity作为Type的属性,并且当然找不到,因为它是Instance的属性。 / p>

2 个答案:

答案 0 :(得分:3)

您可以直接过滤关系:

Type.objects.filter(instance__quantity__gt=0)

答案 1 :(得分:1)

为什么不只为Instance对象查询instance.quantity> 0,然后使用values_list不同的符号?

类似的东西:

types_with_quantity_gt_zero = Instance.objects.filter(quantity__gt=0).values_list('type', flat=True).distinct()