我试图获取一个唯一的外键列表,我写了以下代码:
my_ids = Entity.objects.values('foreign_key').distinct()
但是我只得到了不重复的外键列表... 我错过了什么吗?
谢谢!
我试图获取一个唯一的外键列表,我写了以下代码:
my_ids = Entity.objects.values('foreign_key').distinct()
但是我只得到了不重复的外键列表... 我错过了什么吗?
谢谢!
据我所知,对于MySQL数据库,将参数传递给distinct无效。
这个可以工作,并且只返回一个对象:
Entity.objects.order_by('foreign_key').values('foreign_key').distinct()
也许你想选择这个:
Entity.objects.order_by().values_list('foreign_key', flat=True).distinct()
Entity.objects.values_list('foreign_key', flat=True).distinct().order_by()
distinct
在没有order_by
的情况下无法工作,Django文档中已经解释过:
order_by()
调用中使用的任何字段都包含在 SQL SELECT
列中。当与 distinct()
结合使用时,这有时会导致意外结果。如果按照相关模型中的字段排序,则这些字段将被添加到所选列中,它们可能使本来重复的行看起来不同。由于额外的列不出现在返回的结果中(它们只是为了支持排序而存在),因此有时看起来好像返回了非唯一结果。同样地,如果使用 values()
查询限制所选的列,则任何 order_by()
(或默认模型排序)中使用的列仍将参与并可能影响结果的唯一性。这里的道德是,如果您正在使用 distinct()
,请小心按相关模型排序。同样,在同时使用 distinct()
和 values()
时,请小心按不在 values()
调用中的字段排序。order_by()
实际上并不排序,但解决了去重的问题。这太疯狂了。 - Csaba Toth.order_by()
不带参数时会清除查询集上的任何默认或现有排序。 - Tim TisdallEntity.objects.order_by('foreign_key').distinct('foreign_key')
set()
以获取不同的值。