有没有更好的方法来使用 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)

但是我看不出这有什么真正的好处。我个人认为您的原始代码更具可读性。