2016-10-11 2 views
0

私はユーザーがパラメータを取得URLを介してジャンゴでページ番号付きクエリセットをフィルタリングする機能を与えるために、いくつかの機能を追加しようとしている、と首尾よく働いて、これを持っている:文字列がDjangoクエリーセットの有効なフィルターであるかどうかを確認する方法はありますか?

for f in self.request.GET.getlist('f'): 
    try: 
     k,v = f.split(':', 1) 
     queryset = queryset.filter(**{k:v}) 
    except: 
     pass 

しかし、私はそうすることを期待していますtry/exceptブロックを使用しないでください。文字列が有効なフィルタパラメータであるかどうかをチェックする標準的な方法がdjangoにありますか?

例えば何かのように:

my_str = "bad_string_not_in_database" 
if some_queryset.is_valid_filter_string(my_str): 
    some_queryset.filter(**{my_str:100}) 
+0

私が正しく理解している場合、リンクから情報を見つけることができます:https://docs.djangoproject.com/en/1.10/topics/db/managers/ –

+0

私はカスタムに余分なコマンドを追加するつもりはありませんマネージャー、私はそのような方法が既に存在するかどうかを知りたい。 –

+0

"first"レベルのフィルタであればモデルにhasattrが含まれている可能性があります。 –

答えて

0

短い答えはノーですが、他の選択肢があります。

Djangoは、あなたが求めている種類の検証関数を提供したり、作成したりすることは容易ではありません。完全に異なるモデルのフィールドにあるrelated_nameまたはrelated_query_nameがクエリセットをフィルタリングするためにvalid wayである可能性があるフィールドとフォワードリレーションシップだけでなく、リバースリレーションシップもフィルタリングできます。これらの関係名の接尾辞として有効なiexact,startswithregexなどのさまざまなフィルタリングメカニズムがあります。したがって、すべてを正しく検証するには、Djangoの内部解析コードをたくさん複製する必要があります。これは大きな間違いです。

このモデルのフィールドと転送関係でフィルタリングする場合は、hasattr(SomeModel, my_str)を使用できますが、これは常に正しく機能するとは限りません(モデルにはメソッドやプロパティなどのフィールド以外の属性があります)。

ブランケットexcept: passを実行する代わりに、無効な文字列がフィルタリングのkwargs(it's TypeError)で使用されたときにスローされる特定のエラーをキャッチすることができます。フィルタされていないクエリーセットを静かに続けるのではなく、リクエストが有効ではないことをクライアントに知らせるために400エラーを返すこともできます。

私の好ましい解決策は、この種の定型化可能な汎用ロジックをdynamic-restなどのライブラリに委託することです。

1

あなたは、フィールド名を見ることによって開始することができます:あなたはまた、おそらくのようなfield__icontainsfield__gteがそう多くの作業が必要になるなどの拡張子を持つ仕事をしたいしようとしている

qs.model._meta.get_all_field_names() 

免責事項try/exceptははるかに優れた方法です。なぜこの方法を却下したいのか分かりません。

関連する問題