Django -模特的选择

inkz8wg9  于 2023-01-06  发布在  Go
关注(0)|答案(2)|浏览(102)

我一直在搜索和查找文档,但我想问一下并确认这里的最佳解决方案。
尝试定义模型选择。
1.“是、否和不确定”选项,从无线电选择
1.如何定义多项选择
简单示例:在我的网站上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来代替“是、否、不确定”问题?
1.这是定义和存储多项选择题答案的正确方法吗?有时,我看到人们使用manytomany对象。
只是想使用Django提供的最有效和最简单的方法。

y4ekin9u

y4ekin9u1#

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

但是,这仍然不适用于多重选择。

w8biq8rn

w8biq8rn2#

是的,NullBoolean是合适的,但是如果有更多的选项不适合NullBoolean的配置文件,我赞成IntegerField,因为它具有可读性和跨选项的一致性。
Null可能直观地表示n/a,但是随着您添加更多的单选题,我认为使用Map到静态变量的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一起开箱即用。

相关问题