2011-01-15 11 views
11

フィールドを指定します。Djangoモデルのフィールドの選択 - dictは良くないでしょうか?

domain_status_choices = (
    (1,'Live') 
    (2,'Offline') 
    (3,'Dev') 
) 
status = models.SmallIntegerField(choices=domain_status_choices) 

は私が取得して設定数値表現とテキストラベルを取得するためにget_status_display()を使用することができます知っています。しかし、ユーザがstatus=Offlineを投稿した場合、それを保存するにはどうすれば数値を取得できますか?また、数字やテキストの値がリストにあることを検証できるようにしたいと思います。

私には、ディクテーションを使用する方が理にかなっています。ここに私の現在の方法があります。

domain_status_choices = { 
    1: 'Live', 
    2: 'Offline', 
    3: 'Dev', 
} 
status = models.SmallIntegerField(choices=domain_status_choices.iteritems()) 
... 
if input1 not in domain_status_choices.keys(): print "invalid" 
if input2 not in domain_status_choices.items(): print "invalid" 
status = [k for k, v in domain_status_choices.iteritems() if v == input3][0] 

良い方法はありますか?タプルのタプルが通常使用されるのはなぜですか?

+0

あなたはこのユースケースのためcollections.OrderedDictを使用してみましたか? (オプションの順番を保つため)http://pymotw.com/2/collections/ordereddict.html –

答えて

13

私はdictのキーが(あなたが明らかにOrderedDictを使用しない限り)ソートされているとは限りません。つまり、あなたのバージョンでは、 "オフライン"、 "開発"、 "ライブ"の選択肢が得られるかもしれません。 dict.items

実装注:

キーと値は、非ランダムであるPythonの実装を横切って変化し、挿入および欠失の辞書の履歴に依存する任意の順序で列挙されています。

+0

私の場合、数値キーを使ってリストを使うことはできますか? (タプルのリストではない) または、私がこの方法を守ることができる順序を心配しなければ、 – Jake

+0

Pythonの動作のおかげで、Fieldの 'choices'に渡すものは自由に作成することができます。あなたが主に他の方法で選択肢を使用している場合、そのリスト/ dict /それを '​​フィールド(choices =)'に渡すときにのみ何かを変えることは間違っていません(つまり 'iteritems'があなたのために働くそれはいいです)。要点は単純です:Djangoは選択の順序は恣意的ではないと仮定しています。 – vicvicvic

3

@のvicvicvicの答えに私のコメントに拡大:

t = [ 'Live', 'Offline', 'Dev', ] 
status = models.SmallIntegerField(choices=[(i,t[i]) for i in range(len(t))]) 
... 
if not 0 <= int(input1) < len(t): print "invalid" 
if input2 not in t: print "invalid" 
status = t.index(input2) 
+3

列挙型を使用してpythonicityを上げる: '[(i、v)for i、v in enumerate(t)]' – TryPyPy

+4

'just enumerate(t)'はどうでしょうか? – Jake

関連する問題