我一直在搜索和查看文档,但我想询问并确认这里的最佳解决方案。
试图定义模型选择。
简单的例子:在我的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)
...这是最好的方法吗?
只想使用Django提供的最有效和最简单的方法。
发布于 2011-04-25 08:57:32
是的,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一起工作。
发布于 2012-08-31 17:01:36
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!'尽管如此,这仍然不能适用于多种选择。
https://stackoverflow.com/questions/5776333
复制相似问题