フィールドの動的な数のジャンゴエレガントなフィルタを構築

ゴンサロDambra:

私は結果をフィルタリングし、それのためのビューを、やって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、もちろん)は、そのフィールドのいずれも必要ありません、あなただけの単一のフィールドまたは2種3のいずれかによってフィルタリングすることができます。

問題は私が行うことができないということです。

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

...ブランド名、およびコストが空/ヌルを送ることができるので、

どのように私は、各フィルタリング可能性のためのフィルタラインコードをせずにこの問題を解決することができますか?

ウィレム・ヴァン・当社:

私たちは、ユーティリティ関数を作ることができることをフィルタNoneの。例えば:

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(
    filter_without_none(account=account, brand=brand, name=name, cost=cost)
)

値の1つ(または複数)のような場合accountbrand及び/又はnameありNone、これらは、あろうないフィルタリングのために考慮されます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=19718&siteId=1