有没有更好的方法来使用Q创建此查询集? django的

时间:2017-12-07 23:31:11

标签: django model django-queryset django-q

我有一个使用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)
有人可以帮我一把吗? 提前致谢

2 个答案:

答案 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))