получить фактическое значение понятного человеку имени из вариантов в моделях Django - PullRequest
0 голосов
/ 27 февраля 2019

Я сделал эту модель:

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')

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Я не понимаю, почему вы используете короткие версии, а вы не собираетесь их использовать.Я бы использовал одно и то же имя дважды, например:

choices=(
            ('Saturday', "Saturday"),
            ('Sunday', "Sunday"),
            ('Monday', "Monday"),
            ('Tuesday', "Tuesday"),
            ('Wednesday', "Wednesday"),
            ('Thursday', "Thursday"),
            ('Friday', "Friday"),
         )

Тогда

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

, очевидно, будет работать просто отлично, и вы добавите ноль сложности в свой код.Это также предлагается в аналогичном старом посте здесь

0 голосов
/ 27 февраля 2019
0 голосов
/ 27 февраля 2019

Это не красиво, но вы можете изменить поиск с помощью мета-атрибута моделей:

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') - но это можно добавить позже и привести к путанице
...