71

我尝试获取不同外键的列表,我写了这个:

my_ids = Entity.objects.values('foreign_key').distinct()

但我只得到一个 UNDISTINCT 外键列表......我错过了什么?

谢谢!

4

4 回答 4

64

将参数传递给 distinct 不适用于 MySQL 数据库(AFAIK)

这个有效并且只返回一个对象:

Entity.objects.order_by('foreign_key').values('foreign_key').distinct()

于 2012-06-01T11:15:29.390 回答
61

也许您可能想这样做:

Entity.objects.order_by().values_list('foreign_key', flat=True).distinct()
于 2012-06-01T10:58:04.337 回答
36
Entity.objects.values_list('foreign_key', flat=True).distinct().order_by()

distinct如 Django 文档中所解释的那样,order_by没有就无法工作:

调用中使用的任何字段order_by()都包含在 SQLSELECT 列中。与 结合使用时,这有时会导致意外结果distinct()。如果您按相关模型中的字段排序,这些字段将添加到选定的列中,否则它们可能会使重复的行看起来不同。由于额外的列不会出现在返回的结果中(它们只是为了支持排序),因此有时看起来返回的结果不明显。

同样,如果您使用values()查询来限制选定的列,任何order_by()(或默认模型排序)中使用的列仍将被涉及,并可能影响结果的唯一性。

这里的寓意是,如果您正在使用,请distinct()注意按相关模型排序。同样,在使用distinct()and values()时,在按不在 values()调用中的字段排序时要小心。

于 2016-05-04T11:50:30.143 回答
9
Entity.objects.order_by('foreign_key').distinct('foreign_key')

如果您已经将它们作为列表,则将其转换为 aset()以获取不同的值。

于 2012-06-01T11:00:05.760 回答