Django: получить ключ выбора из отображаемого значения - PullRequest
1 голос
/ 09 января 2020

Допустим, у меня есть следующая Django модель:

class Person(models.Model):
    SHIRT_SIZES = (
        (0, 'Small'),
        (1, 'Medium'),
        (2, 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.IntegerField(choices=SHIRT_SIZES)

Я могу создать экземпляр Person и получить очень просто отображаемое значение shirt_size :

john = Person(name="John", shirt_size=2)
john.shirt_size  # 2
john.get_shirt_size_display()  # 'Medium'

Как я могу сделать это по-другому? То есть, учитывая размер рубашки Medium, как я могу получить целочисленное значение? У меня есть метод для этого или я должен написать свой собственный метод для объекта Person, например:

class Person(models.Model):
    ...

    @staticmethod
    def get_shirt_size_key_from_display_value(display_value):
    for (key, value) in Person.SHIRT_SIZES:
        if value == display_value:
            return key
        raise ValueError(f"No product type with display value {display_value}")

Ответы [ 2 ]

0 голосов
/ 09 января 2020
choices_dict = {y: x for x, y in shirt_size.choices}

даст вам словарь со всеми значениями в качестве значений, а размеры в качестве ключей.

Таким образом, вы можете написать функцию, которая возвращает int любого размера рубашки, который вы положили или сделайте choices_dict частью вашего Person объекта.

0 голосов
/ 09 января 2020

В документах рекомендуется следующее:

class Person(models.Model):
    SMALL = 0
    MEDIUM = 1
    LARGE = 2
    SHIRT_SIZES = (
        (SMALL, 'Small'),
        (MEDIUM, 'Medium'),
        (LARGE, 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.IntegerField(choices=SHIRT_SIZES)

Теперь имя MEDIUM прикреплено к вашей модели и экземплярам модели:

>>> john = Person(name="John", shirt_size=2)
>>> john.shirt_size
2
>>> john.MEDIUM
2

Если указано строку, вы можете использовать getattr:

def get_shirt_size(instance, shirt_size):
    return getattr(instance, shirt_size.upper())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...