Django Queryset中的Q对象

时间:2015-05-05 15:08:29

标签: django django-models django-q

我有三个vaiables:first_name,last_name和middle_name。

过滤我正在做的结果

Q(contact__first_name__icontains=query) |
Q(contact__last_name__icontains=query) |
Q(contact__middle_name__icontains=query) 

我希望能够在first_name,last_name和middle_name的串联中搜索查询。我怎么能用Q对象呢?

这可能吗?

1 个答案:

答案 0 :(得分:0)

对Q感到怀疑,但是extra可能会尝试:

SQLite3:
Person.objects.extra(where=["first_name || ' ' || middle_name || ' ' || last_name = " + query])

MySQL:
Person.objects.extra(where=["CONCAT(first_name, ' ', middle_name, ' ', last_name) = " + query])

如果您开始使用原始SQL,则可能无法在不同的数据库引擎上移植。

关于Q,如Django网站所引用:

  

Q()对象,就像F对象一样,将一个SQL表达式封装在一个   可以在与数据库相关的操作中使用的Python对象。

您可以更改您的方法,如下所示:

query = 'MyFirstName MyMiddleName MyLastName'.split(" ")

Q(contact__first_name__icontains=query[0]) &
Q(contact__last_name__icontains=query[2]) &
Q(contact__middle_name__icontains=query[1])