Джанго - выбор моделей - PullRequest
       29

Джанго - выбор моделей

2 голосов
/ 25 апреля 2011

Я искал и просматривал документы, но хочу спросить и подтвердить лучшее решение здесь.

Попытка определить выбор модели.

  1. выбор «да, нет и не уверен». From Radio Select
  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.

Ответы [ 2 ]

5 голосов
/ 31 августа 2012

18 месяцев или около того, теперь в Django есть лучший способ справиться с choices; Лукаша Ланги dj.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!'

Это все равно не будет работать для нескольких вариантов выбора.

1 голос
/ 25 апреля 2011

Да, 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.

...