Django - 过滤查询 returns 不正确的查询集

Django - filter query returns incorrect 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是从VendorCluster的一个ManyToManyField模型,如下-

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)`

我预计会 return [{'cluster': 3, 'id': 2}, {'cluster': 3, 'id': 3}]

但是,returns

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

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

但是,我希望它 return 仅那些映射到该集群 ID 的查询。

尝试将 filter 子句放在 values 子句之前

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

The people who made Django prefer to put all the SQL-affecting methods first, followed (optionally) by any output-affecting methods (such as values()), but it doesn’t really matter. This is your chance to really flaunt your individualism.

我认为你对原因的猜测可能是正确的