2

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

试图定义模型选择。

  1. “是,否,不确定”来自 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 提供的最有效和最简单的方法。

4

2 回答 2

5

18 个月左右之后,现在choices在 Django 中有更好的处理方式;Łukasz Langa 的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!'

不过,这仍然不适用于多项选择。

于 2012-08-31T17:01:36.800 回答
1

是的,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.

于 2011-04-25T08:57:32.587 回答