Django - 模型的选择
问题描述:
我一直在寻找并浏览文档,但我想询问并确认最佳解决方案。Django - 模型的选择
尝试定义模型选择。
- “赞成,反对和不能确定的选择从广播选择
- 我将如何定义多选题
简单的例子: 在我的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)
...
那是最好的方法吗?
- 我应该用NullBooleanField代替yes,no,不知道问题吗?
- 这是一个正确的方式来定义和存储多选答案?有时候,我看到人们使用许多物品。
只是想使用从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
。
答
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!'
这仍然不能进行多选工作,虽然。
难道你不能用[icontains](http://docs.djangoproject.com/en/dev/ref/models/querysets/#icontains)过滤多个选项卡吗? – DTing 2011-04-25 11:21:23
我想是的。您可以设置'01','02'来设置100个选项! – 2011-04-25 16:02:23
谢谢Yuji的明确回答。还有一个问题,如果我有很多multichoices项目..说15个不同的multichoice项目,那么我需要15额外manytomany关系。性能可以吗? – DavidL 2011-04-25 17:46:17