我有一个使用 filter
的查询,但我知道有一个称为 Q
的东西,但是尝试使用它,我不确定如何使用 Q
。我不确定哪一个会更好,但试图知道另一种方法来进行查询。
我实际想做的是...对于我的QuerySet返回,我有一个默认字段和两个输入字段,这些字段是选项。
假设,默认语言是英语,有一个位置和标题字段。如果可用位置和标题字段,请查询查询位置,标题和语言。如果仅位置,则仅查询位置和语言,如果仅查询标题,则仅查询标题和语言。
我已经做到了两种方法,一种仅带有过滤器的代码较少...
postings = Posting.objects.filter(language='EN')
if kwargs.get('title'):
postings = postings.filter(title__icontains=kwargs.get('title'))
if kwargs.get('location'):
postings = postings.filter(location__icontains=kwargs.get('location'))
以上确实仅使用filter
我试图查看我是否可以使用Q
来做到这一点,但似乎无法使其起作用
我目前有这样的东西
if title and location:
postings = Posting.objects.filter(title__icontains=title, location__icontains=location, language='EN')
else:
queryQ = Q(posting_language='EN')
if title:
queryQ |= Q(title__icontains=title)
if location:
queryQ |= Q(location__icontains=location)
postings = Posting.objects.filter(queryQ)
有人可以给我一个人吗?预先感谢
首先,|
用于Oring Q
对象。您想要&
的ANDing
。
您可以将过滤代码重写为:
queryQ = Q(posting_language='EN')
if title:
queryQ &= Q(title__icontains=title)
if location:
queryQ &= Q(location__icontains=location)
postings = Posting.objects.filter(queryQ)
但是,我看不到这一点的真正优势。我个人认为您的原始代码更可读。
我认为您误解了Q的目的。Q主要用于DJANGO,用于需要或/和/和/和/和/和的更复杂的查询语句。
所以,您可以做这样的事情:
postings = Posting.objects.filter(Q(title__icontain=title) | Q(location=location))
这将为您提供标题包含标题或位置包含位置的所有帖子。在这种情况下,它不是很有用,因为IContains会以空值而失败,并为空字符串值返回所有内容。
q如果您需要使用两个不同icontains的标题发布
,将非常有用。postings = Posting.objects.filter(Q(title__icontains=search_term_a) & Q(title__icontains=search_term_b))