【问题标题】:Postgre SQL ignore the filtering condition if the value is null如果值为空,postgresql 忽略过滤条件
【发布时间】:2020-06-05 12:01:40
【问题描述】:

我将以下三个变量传递给查询A,B and C

A、B 和 C 可以取任何值,包括 null。

当我运行以下查询集时,如果 A、B 或 C 中的值为 null,它应该忽略条件

queryset = User.objects.values().filter(A_name=A, B_name=B, C_name =C)

例如,如果 C 值传入 null,那么查询的行为应该像

queryset = User.objects.values().filter(A_name=A, B_name=B)

如果 C 和 A 值传入 null,那么查询的行为应该像

queryset = User.objects.values().filter(B_name=B)

我不想写下所有 9 个组合并写一个查询。有什么方法可以轻松做到吗?

【问题讨论】:

    标签: sql django postgresql django-views


    【解决方案1】:

    首先,创建您自己的Custom Model Manager

    class MyManager(models.Manager):
        def custom_filter(self, *args, **kwargs):
            filtered_kwargs = {key: value for key, value in kwargs.items() if value}
            return super().filter(*args, **filtered_kwargs)

    然后在你的模型中连接起来,

    class MyModel(models.Model):
        objects = MyManager()
        # other model fields

    现在,将您的查询集过滤为,

    queryset = User.objects.values()<b>.custom_filter(</b>A_name=A, <b>B_name=SomeNullValue</b>)

    【讨论】:

      【解决方案2】:

      您可以将参数保留为 dict 并仅将不等于 None 的参数发送到 filter() 方法:

      arguments = {"A_name": A, "B_name": B, "C_name": C}
      arguments_without_null = {k: v for k, v in arguments.items() if v is not None}
      queryset = User.objects.values().filter(**arguments_without_null)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-18
        • 2019-11-05
        • 1970-01-01
        • 1970-01-01
        • 2016-12-18
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多