2

我有这个设置:

class ModelA:
    name = models.TextField('Name')

class ModelB:
    name = models.TextField('Name')
    a = models.ForeignKey(ModelA)

我想做的是获取 ModelB 拥有的所有不同 ModelA 的列表。例如,我的数据库如下所示:

a1 = ModelA(name='a1')
a2 = ModelA(name='a2')
a2 = ModelA(name='a3')
b1 = ModelB(name='b1', a=a1)
b2 = ModelB(name='b2', a=a1)
b2 = ModelB(name='b2', a=a3)

然后我希望查询的结果是 [a1, a3]。

实际上,在一个地方,我想要的只是列表的计数,但我认为如果我能得到列表的计数,那是微不足道的。

4

1 回答 1

4

您可以结合使用反向查找 distinct

ModelA.objects.filter(modelb__isnull=False).distinct("name")

您可以传递位置参数 (*fields) 以指定应应用 DISTINCT 的字段的名称。这将转换为 SELECT DISTINCT ON SQL 查询。这就是区别。对于普通的 distinct() 调用,数据库在确定哪些行是不同的时比较每一行中的每个字段。对于具有指定字段名称的 distinct() 调用,数据库将仅比较指定的字段名称。

于 2013-04-05T18:48:09.013 回答