Django查询设置深入排除

时间:2011-07-11 14:45:48

标签: django django-models django-queryset

我有三节课 产品有很多描述,每个型号都有很多商店 我想做什么

select all products but store.qty value > 0

我试过

pr = Product.objects.all().exclude(Product__Product_description__qty > 0)

我该怎么做?

class Product
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)

class Product_description
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    product = models.ForeignKey(Product)

class Store
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    desc = models.ForeignKey(Product_description)
    qty = models.IntegerField()

1 个答案:

答案 0 :(得分:2)

pr = Product.objects.filter(Product_description__qty__lte = 0)

或者如果你真的必须使用exclude:

pr = Product.objects.exclude(Product_description__qty__gt = 0)
在任何一种情况下都不需要{p> all();您最终会构建一个未触发的代理,然后构建过滤/排除查询集。它浪费了内存和CPU,但没有做任何事情。只有.delete()运算符需要一个有效的all()查询集,但这是一个明确设计的特殊情况,可以避免意外破坏数据集。

Django Queryset API文档非常易读。

Django惯例是命名您的班级ProductDescription

这看起来像是一个落后的层次结构。为什么商店会有“产品说明?”产品本身不是元数据,您关心的是商店有一定数量的产品吗?或者这些产品是否存在,即您想要找到商店至少有一个绿色或蓝色或橙色产品的所有产品?有些东西告诉我你的项目需要仔细重新思考。