2012-02-04 5 views
3

私はビューの値のリストを送信したDjangoフォームを持っていました。私は最初にメソッドを取得してリストを取得しようとしましたが、最後のものだけが返されたことがわかりました。getlistを使用する必要があります。私の周りにつまずき、いくつかは、この行動の動機を説明しclosed Django bugを見つけた後:Django HTTPリクエストはget対getlistの動作を受け取ります

この背後にある理由は、APIメソッドは、一貫した文字列またはリスト、決して両方を返すべきであるということです。 Webアプリケーションの一般的なケースは、フォームキーが単一の値に関連付けられることです。したがって、[]構文と同じです。 getlist()は、あなたのような場合に、単一の値に対してキーを複数回使用する場合に使用します。

これは実際にはベストプラクティスかどうか疑問に思っています。これはgetメソッドが他のデータ構造で動作する方法と矛盾します。辞書。

+0

私にとってこれは嫌なものです – Goin

答えて

7

HTTPリクエストは、1つのパラメータ(キー)に割り当てられた複数の値をサポートします。そういうわけで、人々はそれを使って(時には)使うことができるのです。それで、DjangoがMultiValueDict構造を導入した理由です。

get()getlist()に分割すると、エラーを回避してビューコードを簡単に保つことができます。

  • get()は常にリストを返す:彼らはすべてまったく同じことを行うにはより多くのコードを必要とし、他の行動を考えてみましょう。

    ほとんどの場合、1つのキーに1つの値を渡すので、[0]を追加し、デフォルト値をリストとして提供する必要があります。

    param = request.GET.get('param', ['default value',])[0]

  • get()値の数に応じて、単一の値又はリストを返します。

これは、複数のオプションが許可されたHTMLセレクトの欠点です。人々はゼロ、1つ以上の値を選択できます。それはあなたが自分でリストしたり、反対方向にするために単一の値を変換する必要があります意味:

常に単一の値を返す
params = request.GET.get('params', []) 
# Here you have absolutely no idea if this is a list or a single value 
# But you will need only one of that types 

# If you need list: --------------------------------- 
if not isinstance(params, list): 
    params = [params,] 

objs = TestModel.objects.filter(id__in=params).all() 

# If you need single value: ------------------------- 
if isinstance(params, list): 
    params = params[0] # Error if params is empty list... 


obj = TestModel.objects.get(id=params) 
  • get()。その場合、getlistなしで複数の値をどう扱うのですか?

質問に答えるために、get/getlistという付加価値があります。

+0

概要をありがとうと私は動機づけを得るが、それは私にはまだ奇妙です、おそらく私はそのようなアプローチに慣れていないでしょう。私は、メソッドに頼るのではなく、関連する型への変換のコードを持つことになりますが、なぜメソッドを一貫させたいのか分かります。 –

関連する問題