Postgre SQL игнорировать условие фильтрации, если значение равно нулю - PullRequest
2 голосов
/ 21 февраля 2020

У меня есть следующие три переменные, переданные в запрос A,B and C.

A, B и C могут принимать любые значения, включая ноль.

Когда я запускаю приведенный ниже набор запросов, он должен игнорировать условие, если значение в A, B или C равно нулю

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

Например, если значение C передано в ноль, запрос должен вести себя как

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

А если C и значение передано в ноль, то запрос должен вести себя как

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

Я не хочу писать все 9 комбинаций и писать запрос. Есть ли способ, которым я могу сделать это легко?

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Изначально создайте свой собственный Диспетчер пользовательских моделей

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

, а затем подключитесь к вашей модели как

class MyModel(models.Model):
    <b>objects = MyManager()</b>
    # other model fields

Теперь отфильтруйте ваш набор запросов как

queryset = User.objects.values()<b>.custom_filter(</b>A_name=A, <b>B_name=SomeNullValue</b>)
1 голос
/ 21 февраля 2020

Вы можете сохранить аргументы как dict и отправить в метод filter () только те из них, которые не равны None:

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)
...