Django - 模型的选择

问题描述:

我一直在寻找并浏览文档,但我想询问并确认最佳解决方案。Django - 模型的选择

尝试定义模型选择。

  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代替yes,no,不知道问题吗?
  2. 这是一个正确的方式来定义和存储多选答案?有时候,我看到人们使用许多物品。

只是想使用从Django提供的最高效和最简单的方法。

是的,NullBoolean是合适的,但如果有更多的选项不适合NullBoolean的配置文件,我赞成IntegerField的可读性和跨选项的一致性。

Null可以直观地表示n/a,但是当您添加更多单选题时,我认为使用映射到静态变量的IntegerField更加直观。

此外,对于这种类型的场景,用户可能会根据这些功能筛选属性,因此在动态查询中不需要特殊情况为空。

例子:

...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

+0

难道你不能用[icontains](http://docs.djangoproject.com/en/dev/ref/models/querysets/#icontains)过滤多个选项卡吗? – DTing 2011-04-25 11:21:23

+0

我想是的。您可以设置'01','02'来设置100个选项! – 2011-04-25 16:02:23

+0

谢谢Yuji的明确回答。还有一个问题,如果我有很多multichoices项目..说15个不同的multichoice项目,那么我需要15额外manytomany关系。性能可以吗? – DavidL 2011-04-25 17:46:17

18个月左右后,现在有更好的方法来处理Django中的choices; Łukasz Langa's dj.choices。其使用的一个例子,从blog post introducing the project

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!' 

这仍然不能进行多选工作,虽然。