这是我的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
是从ManyToManyField
到Vendor
模型的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的查询。
答案 0 :(得分:1)
尝试将filter
子句放在values
子句
我不是百分百肯定为什么......奇怪的是,文档说这无关紧要:
https://docs.djangoproject.com/en/1.7/ref/models/querysets/#django.db.models.query.QuerySet.values
制作Django的人更喜欢首先放置所有影响SQL的方法,然后(可选)使用任何影响输出的方法(例如values()),但这并不重要。这是你真正炫耀个人主义的机会。
我认为您猜测为什么可能是正确的