Django不区分大小写的“不同”查询

时间:2017-06-02 15:28:07

标签: python django orm

我正在使用此django查询

people.exclude(twitter_handle=None).distinct('twitter_handle').values_list('twitter_handle', flat=True)

我的独特查询返回两个对象 例如:

['Abc','abc']

我如何获得不区分大小写的结果?就像在这种情况下只有

['abc']

使用django 1.9.6, python 2.7

2 个答案:

答案 0 :(得分:1)

您可以.annotate()Func() expressions一起使用.distinct()代替twitter_handle值:{/ p>

>>> from django.db.models.functions import Lower
>>> people.order_by().exclude(twitter_handle=None).annotate(handle_lower=Lower("twitter_handle")).distinct("handle_lower")

您无法将values_list('twitter_handle', flat=True)附加到上述查询中,因为您无法在distinct中不存在的字段上应用values_list你必须自己做:

 >>> queryset = people.order_by().exclude(twitter_handle=None).annotate(handle_lower=Lower("twitter_handle")).distinct("handle_lower")
 >>> [p.twitter_handle for p in queryset]

或者您可以获得小写的twitter_handle值:

>>> people.order_by().exclude(twitter_handle=None).annotate(handle_lower=Lower("twitter_handle")).distinct("handle_lower").values_list("handle_lower", flat=True)

答案 1 :(得分:0)

一种解决方案是使用annotate创建一个小写值的新字段,然后使用distinct

尝试类似

的内容
from django.db.models.functions import Lower

(people.exclude(twitter_handle=None)
      .annotate(handle_lower=Lower('twitter_handle'))
      .distinct('handle_lower'))