首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django -模型选择

Django -模型选择
EN

Stack Overflow用户
提问于 2011-04-25 07:44:45
回答 2查看 13.8K关注 0票数 2

我一直在搜索和查看文档,但我想询问并确认这里的最佳解决方案。

试图定义模型选择。

  1. “是的,不是,也不确定”
  2. 如何定义多个选择

简单的例子:在我的models.py中,我有

代码语言:javascript
复制
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提供的最有效和最简单的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-25 08:57:32

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

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

同样,对于这样的场景,用户可能会根据这些特性筛选属性,在动态查询中不需要特殊情况下的Null是很有用的。

示例:

代码语言:javascript
复制
...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/

代码语言:javascript
复制
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一起工作。

票数 1
EN

Stack Overflow用户

发布于 2012-08-31 17:01:36

18个月后,在Django,现在有了一种更好的方法来处理choicesdj.choices。它的使用示例,来自博客文章介绍了这个项目

代码语言:javascript
复制
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!'

尽管如此,这仍然不能适用于多种选择。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5776333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档