有没有更好的方法来使用 Q 来制作这个查询集?姜戈
Is there a better way to make this queryset using Q? django
我有一个使用 filter
的查询,但我知道有一个叫做 Q
的东西,但我想尝试一下,但我不确定如何使用 Q
.我不确定哪个更好,但想知道另一种查询方式。
我真正想做的是...
对于我的查询集 return 我有一个默认字段和两个可选的输入字段。
比方说,默认语言是英语,有位置和标题字段。如果位置和标题字段可用,则进行查询以查询位置、标题和语言。如果只有location则只查询location和language,如果只有title则只查询title和language
我有两种方法,一种只使用过滤器,代码更少...
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)
有人可以帮帮我吗?
提前致谢
我认为您误解了 Q 的含义。 Q在django中主要用于需要OR/AND的更复杂的查询语句。
所以,你可以这样做:
postings = Posting.objects.filter(Q(title__icontain=title) | Q(location=location))
这将为您提供标题包含标题或位置包含位置的所有帖子。它在这种情况下不是很有用,因为 icontains 将失败并返回 Null 值,并且 return 一切都是空字符串值。
如果您需要使用两个不同图标的标题的帖子,Q 将非常有用
postings = Posting.objects.filter(Q(title__icontains=search_term_a) & Q(title__icontains=search_term_b))
首先,|
用于 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)
但是我看不出这有什么真正的好处。我个人认为您的原始代码更具可读性。
我有一个使用 filter
的查询,但我知道有一个叫做 Q
的东西,但我想尝试一下,但我不确定如何使用 Q
.我不确定哪个更好,但想知道另一种查询方式。
我真正想做的是... 对于我的查询集 return 我有一个默认字段和两个可选的输入字段。
比方说,默认语言是英语,有位置和标题字段。如果位置和标题字段可用,则进行查询以查询位置、标题和语言。如果只有location则只查询location和language,如果只有title则只查询title和language
我有两种方法,一种只使用过滤器,代码更少...
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)
有人可以帮帮我吗? 提前致谢
我认为您误解了 Q 的含义。 Q在django中主要用于需要OR/AND的更复杂的查询语句。
所以,你可以这样做:
postings = Posting.objects.filter(Q(title__icontain=title) | Q(location=location))
这将为您提供标题包含标题或位置包含位置的所有帖子。它在这种情况下不是很有用,因为 icontains 将失败并返回 Null 值,并且 return 一切都是空字符串值。
如果您需要使用两个不同图标的标题的帖子,Q 将非常有用
postings = Posting.objects.filter(Q(title__icontains=search_term_a) & Q(title__icontains=search_term_b))
首先,|
用于 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)
但是我看不出这有什么真正的好处。我个人认为您的原始代码更具可读性。