Создайте элегантный фильтр Django с динамическим числом полей c - PullRequest
2 голосов
/ 01 марта 2020

У меня есть модель Django, которую я делаю для нее, которая фильтрует результаты.

models.py:

Ingredient(models.Model):
    account = models.ForeignKey(Account, on_delete=models.CASCADE, null=False)
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE, null=False)
    name = models.CharField(max_length=100, null=False, blank=False)
    cost = models.DecimalField(max_digits=14, decimal_places=2, null=False)

Теперь дело в том, что поиск форма (которая имеет все поля, кроме account, конечно), ни одно из ее полей не является обязательным, вы можете фильтровать либо по одному полю или два или три из них.

Проблема в том, что я могу 'do do:

Ingredient.objects.filter(account=account, brand=brand, name=name, cost=cost)

... потому что марка, название и стоимость могут быть отправлены пустыми / нулевыми

Как решить эту проблему, не создавая код строки фильтра для каждой возможности фильтрации

1 Ответ

2 голосов
/ 01 марта 2020

Мы можем создать служебную функцию, которая отфильтровывает None s. Например:

from django.db.models import Q

def filter_without_none(**kwargs):
    return Q(**{k: v for k, v in kwargs.items() if v is not None and v != ''})

Теперь мы можем фильтровать с помощью:

Ingredient.objects.filter(
    <b>filter_without_none(</b>account=account, brand=brand, name=name, cost=cost<b>)</b>
)

Если одно (или несколько) из значений, таких как account, brand и / или name None, они не будут учитываться при фильтрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...