2

私はドキュメントを検索して調べてきましたが、ここで最善の解決策を尋ねて確認したいと思います。

モデルの選択を定義しようとしています。

  1. 「はい、いいえ、わからない」ラジオセレクトからの選択
  2. 複数の選択肢をどのように定義しますか

簡単な例:models.pyには、次のようなものがあります。

class Property(models.Model):
    name = models.CharField()

class Feature(models.Model):
    YES_CHOICES = (       # example of 1, there can be only one selection
        ('YES', 'Yes'),
        ('NO', 'No'),
        ('NOT_SURE', 'Not Sure')
    )
    PARKING_CHOICES = (    # example of 2, there can be multiple selections
        ('GARAGE', 'Garage'),
        ('STREET', 'Street'),
        ('PRIVATE_LOT', 'Private Lot'),
        ('VALET', 'Valet'),
    )

    nearby_school = models.CharField(max_length=8, choices=YES_CHOICES)
    parking_options = models. MultipleChoiceField(choices=PARKING_CHOICES)

class PropertyFeature(models.Model)
    property = models.ForeignKey(Property)
    feature = models.ForeignKey(Feature)
    ...

それらを行うための最良の方法はありますか?

  1. はい、いいえ、わからない質問の代わりにNullBooleanFieldを使用する必要がありますか?
  2. それは、多肢選択式の回答を定義して保存するための正しい方法ですか?時々、多対多のオブジェクトを使用している人を見かけます。

Djangoが提供する最も効率的で最も簡単な方法を使用したいだけです。

4

2 に答える 2

5

choices18か月かそこら後、 Djangoで対処するためのより良い方法があります。ŁukaszLanga'sdj.choicesプロジェクトを紹介するブログ投稿からのその使用例:

from dj.choices import Choices, Choice

class Gender(Choices):
    male = Choice("male")
    female = Choice("female")
    not_specified = Choice("not specified")

class User(models.Model):
    gender = models.IntegerField(choices=Gender(),
            default=Gender.not_specified.id)

    def greet(self):
        gender = Gender.from_id(self.gender)
        if gender == Gender.male:
            return 'Hi, boy.'
        elif gender == Gender.female:
            return 'Hello, girl.'
        else:
            return 'Hey there, user!'

ただし、これは複数の選択では機能しません。

于 2012-08-31T17:01:36.800 に答える
1

はい、NullBoolean適切ですが、のプロファイルに適合しないオプションが他にもある場合は、読みやすさとオプション間の一貫性をNullBoolean優先します。IntegerField

Null直感的に意味する可能性がありますが、単一選択の質問を追加するにつれて、静的変数にマップされたものn/aを使用する方がさらに直感的だと思います。IntegerField

また、ユーザーがこれらの機能に基づいてプロパティをフィルタリングする可能性があるこのタイプのシナリオでは、動的クエリでNullを特殊なケースにする必要がないことが役立ちます。

例:

...filter(Q(nearby_school__isnull=True) | Q(nearby_school='NO')),
    other_choice='SOME_CHOICE')
# vs
...filter(Q(nearby_school=Feature.NOT_SURE) | Q(nearby_school=Feature.NO)), 
    other_choice=Feature.SOME_CHOICE)

この古代の投稿は今でも素晴らしい参考資料として役立ちます: http ://www.b-list.org/weblog/2007/nov/02/handle-choices-right-way/

class Feature(models.Model):
    YES = 0
    NO = 1
    NOT_SURE = 2
    SOMETIMES = 3
    YES_CHOICES = ( 
        (YES, 'Yes'),
        (NO, 'No'),
        (NOT_SURE, 'Not Sure'),
        (SOMETIMES, 'Sometimes'), # extensible.
    )

多肢選択式のフィールドに関しては、m2mフィールドを使用するのが最も簡単で最良の方法だと思います。

forms.MultipleChoiceFieldデータをカンマ区切りのフィールドとして保存して適切に表示するように設定することもできますが、m2mフィールドを簡単にクエリできるという事実は、大きなメリットです+ ModelMultipleChoiceField

于 2011-04-25T08:57:32.587 に答える