是否有更好的方法可以使用Q进行此QuerySet?Django



我有一个使用 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))