Django - 过滤查询返回不正确的查询集

时间:2015-03-17 17:10:54

标签: django django-queryset

这是我的Vendor模型。

class Vendor(models.Model):
    cluster = models.ManyToManyField(Cluster)
    name = models.CharField(_("vendor name"),max_length=30)
    phone = models.IntegerField(_("vendor phone no."),max_length=10)
    address = models.CharField(_("vendor address"),max_length=70)
    objects = VendorManager()

def __str__(self):
    return self.name

cluster是从ManyToManyFieldVendor模型的Cluster,具体如下 -

class Cluster(models.Model):
    clusterName = models.CharField(_("Locality name"),max_length=70)

现在,我运行以下查询 -

Vendor.objects.values('id','cluster').all()

这会得到结果 - [{'cluster': 3, 'id': 2}, {'cluster': 3, 'id': 3}, {'cluster': 4, 'id': 3}]

显然,ID为3的供应商与两个具有ID 3和4的集群相关,而具有id 2的供应商与ID为2的集群相关联。

在跑步时,

Vendor.objects.values('id','cluster').filter(cluster=3)`

我希望它返回[{'cluster': 3, 'id': 2}, {'cluster': 3, 'id': 3}]

但是,它会返回

[{'cluster': 3, 'id': 2}, {'cluster': 3, 'id': 3}, {'cluster': 4, 'id': 3}].

我不确定,但这可能是因为.filter()找到了与群集ID 3对应的供应商ID,然后返回与该特定供应商ID对应的所有QuerySet。

但是,我希望它只返回那些仅映射到该集群id的查询。

1 个答案:

答案 0 :(得分:1)

尝试将filter子句放在values子句

之前

我不是百分百肯定为什么......奇怪的是,文档说这无关紧要:
https://docs.djangoproject.com/en/1.7/ref/models/querysets/#django.db.models.query.QuerySet.values

  

制作Django的人更喜欢首先放置所有影响SQL的方法,然后(可选)使用任何影响输出的方法(例如values()),但这并不重要。这是你真正炫耀个人主义的机会。

我认为您猜测为什么可能是正确的