【问题标题】:Django queryset filtering not providing expected behaviorDjango 查询集过滤不提供预期的行为
【发布时间】:2022-01-05 07:48:27
【问题描述】:

我有一个应用在前端接收用户的输入。

我尝试实现的功能应该在前端显示所有玩家

 player_filter = 'lte'
 if playerinput_high == '0':
        player_kwargs = {
                'player_points__isnull': True,
                'player_points__{}'.format(reviewsign_high): float(playerinput_high)
            }

        stats = stats.filter(**player_kwargs)

但是,我在这里没有得到任何结果。如果我删除一个参数,即'player_reviews__isnull': True,我会得到所有评论小于或等于 0 的标题。

反之亦然,如果我删除 'player_reviews__{}'.format(playersign_high): float(playerinput_high),我会得到所有统计数据为 NULL 的统计数据。但它们加在一起,显示 0 个结果。关于解决方案的任何想法?谢谢!

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    Django 的 ORM 中的多个过滤器在生成 SQL 时默认为“AND”。您应该考虑使用 Q 对象来指定“或”查询。 https://docs.djangoproject.com/en/3.2/topics/db/queries/#complex-lookups-with-q-objects

    from django.db.models import Q
    titles = titles.filter(Q(**review_kwargs, _connector=Q.OR))
    

    【讨论】:

    • 感谢您的回答。但是,我很好奇 _connector 参数在任何 Q 对象文档中的位置。我知道它的用法,但无法在网上找到它。你能指出我在哪里可以找到诸如_connector 之类的 Q 参数参数吗?谢谢!
    • _connector 不在文档中,变量以下划线开头,表示它是私有/内部变量,未来版本可能不支持。你可以用另一种方式做到这一点... import operator, from functools import reduce,titles =titles.filter(reduce(operator.or_, [f"{key}={value}" for key, value in review_kwargs.items() ]))
    猜你喜欢
    • 1970-01-01
    • 2020-08-22
    • 2019-04-15
    • 2011-09-29
    • 2020-08-28
    • 2021-04-24
    相关资源
    最近更新 更多