【问题标题】:Django: Best way to create a multiple choice fieldDjango:创建多项选择字段的最佳方法
【发布时间】:2018-08-01 14:31:03
【问题描述】:

当在 Django 中创建多选选项时,似乎有两种不同的方法可以做到这一点 - 选项 a 或选项 b,见下文。每个选项相对于另一个选项有什么优势。一个通常比另一个更好吗?我错过了更好的方法吗?

选项a

TYPE_CHOICES=(
    ('teacher', ("Teacher")),
    ('student', ("Student")),
)
user_type  = models.CharField(max_length=20, default='student', choices=TYPE_CHOICES)

选项 b

TYPE_CHOICES=(
    (1, ("Teacher")),
    (2, ("Student")),
)
user_type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, default=1) 

【问题讨论】:

  • 我个人只会按照文档的建议去做。(docs.djangoproject.com/en/2.0/ref/models/fields/…) 在我所有的项目中,我倾向于使用字符串,因为您实际上可以在数据库中看到这些信息,而无需应用程序指示它们的含义.否则,如果有 15-20 个选项,并且您正在 CLI 甚至 GUI 上查看数据库,则需要查找每个整数的含义

标签: django django-models


【解决方案1】:

在过去,每一个字节的内存和存储都是宝贵的,将这些选择存储为小整数是有意义的,但现在它没有真正的实际好处。将其存储为字符串使代码更具可读性,使数据库更易于管理且更易于迁移。因此,我建议使用字符串作为选项值,除非您真的关心存储成本的微小差异。

【讨论】:

    【解决方案2】:

    我可以向您建议第三种选择,它的工作量很小,但可以使您的代码具有可读性并避免以后进行文本比较。

    定义一个枚举

    class UserTypeEnum(enum.Enum):
        """Define enums for user type"""
        TEACHER = 0
        STUDENT = 1 
    

    在模型中

    class Employee(models.Model)
       user_type = models.IntegerField(choices=UserTypeEnum.choices(), 
       default=UserTypeEnum.TEACHER)
    

    然后你可以做检查像

    if user_type == UserTypeEnum.TEACHER:
       ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-13
      • 2020-11-06
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 2018-05-06
      • 1970-01-01
      相关资源
      最近更新 更多