【问题标题】:get the actual value of the human-readable name from choices in django models从 django 模型中的选择中获取人类可读名称的实际值
【发布时间】:2019-02-27 16:19:59
【问题描述】:

我做了这个模型:

name = models.CharField(max_length=3, choices=(
        ('sat', "Saturday"),
        ('sun', "Sunday"),
        ('mon', "Monday"),
        ('tue', "Tuesday"),
        ('wed', "Wednesday"),
        ('thu', "Thursday"),
        ('fri', "Friday"),
    ), null=False, blank=False, primary_key=True)

当我想获取对象时,我只能访问人类可读的选项名称。 如何通过人类可读的名称获取对象? 我试过了,但出错了:

Days.objects.get(name='saturday')

【问题讨论】:

  • 你试过Days.objects.get(name='sat')
  • @webbyfox 我不想使用选择的实际值。我想使用人类可读的值获取对象

标签: django django-models django-views


【解决方案1】:

在你的情况下:instance.get_name_display()

Django 文档:get_FOO_display()

【讨论】:

    【解决方案2】:

    它并不漂亮,但您可以通过模型元属性反向查找:

    class Days(models.Model)
        name = models.CharField(max_length=3, choices=(
                ('sat', "Saturday"),
                ('sun', "Sunday"),
                ('mon', "Monday"),
                ('tue', "Tuesday"),
                ('wed', "Wednesday"),
                ('thu', "Thursday"),
                ('fri', "Friday"),
            ), null=False, blank=False, primary_key=True)
    
        @classmethod
        def human_name_to_choice(cls, human_readable_str):
            return {b: a for a, b in cls._meta.get_field('name').choices}.get(human_readable_str, 'NUL')
    
    # ...
    
    Days.objects.get(name=Days.human_name_to_choice('Saturday'))
    

    您可以将其修改为不区分大小写(以便在您的示例中工作)

    但要小心:

    • 人类可读的字符串不能是唯一的!
    • 如果在选项中找不到人类可读的字符串,它会返回一个虚拟 ('NUL') - 但这可能会在以后添加并导致混淆

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-08
      • 2018-06-01
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      相关资源
      最近更新 更多