我有一个使用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)
有人可以帮我一把吗?
提前致谢
答案 0 :(得分:4)
首先,|
用于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)
然而,我没有看到任何真正的优势。我个人认为你的原始代码更具可读性。
答案 1 :(得分:0)
我认为你误解了Q的用途。 Q主要用在django中,用于需要OR / AND的更复杂的查询语句。
所以,你可以这样做:
postings = Posting.objects.filter(Q(title__icontain=title) | Q(location=location))
这将为您提供标题包含标题或位置包含位置的所有贴子。它在这种情况下不是很有用,因为icontains将以Null值失败并返回空字符串值的所有内容。
如果您需要使用两个不同图标的标题的帖子
,那么Q会非常有用postings = Posting.objects.filter(Q(title__icontains=search_term_a) & Q(title__icontains=search_term_b))