У меня есть следующие три переменные, переданные в запрос 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 передано в null, запрос должен вести себя как

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

И если значения C и A переданы в null, тогда запрос должен вести себя как

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

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

2
srccode 21 Фев 2020 в 07:20

2 ответа

Лучший ответ

Вы можете сохранить аргументы как 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)
1
neverwalkaloner 21 Фев 2020 в 04:27

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

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().custom_filter(A_name=A, B_name=SomeNullValue)
1
Arakkal Abu 21 Фев 2020 в 04:29