Django IntegerField набора выбором = … имя

InterruptedException является контролируемой исключительной ситуацией поэтому, к сожалению, Вы не можете просто проигнорировать его. В самых простых случаях Вы ничего не должны делать в пункте выгоды, потому что Вы уверены, что этого не произойдет.

От API

, Брошенного, когда поток ожидает, сон, или иначе приостанавливаемый в течение долгого времени и другой поток прерывает его с помощью метода прерывания в классе Поток.

97
задан Alexander Ljungberg 13 July 2009 в 03:05
поделиться

4 ответа

Сделайте как , как показано здесь . Затем вы можете использовать слово, которое представляет правильное целое число.

Примерно так:

LOW = 0
NORMAL = 1
HIGH = 2
STATUS_CHOICES = (
    (LOW, 'Low'),
    (NORMAL, 'Normal'),
    (HIGH, 'High'),
)

Тогда они все еще являются целыми числами в БД.

Использование будет thing.priority = Thing.NORMAL

155
ответ дан 24 November 2019 в 05:26
поделиться

Просто замените свои числа на удобочитаемые значения, которые вам нужны. Таким образом:

PRIORITIES = (
('LOW', 'Low'),
('NORMAL', 'Normal'),
('HIGH', 'High'),
)

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

1
ответ дан 24 November 2019 в 05:26
поделиться

Я бы, вероятно, установил диктат обратного просмотра раз и навсегда, но если бы я этого не сделал, я бы просто использовал:

thing.priority = next(value for value, name in Thing.PRIORITIES
                      if name=='Normal')

, что кажется проще, чем создание диктата на лети, чтобы снова выбросить; -).

7
ответ дан 24 November 2019 в 05:26
поделиться

Вот тип поля, который я написал несколько минут назад и который, как мне кажется, делает то, что вы хотите. Его конструктору требуется аргумент choices, который может быть либо кортежем из двух кортежей в том же формате, что и параметр choices для IntegerField, либо вместо этого простым списком имен (например, ChoiceField (('Low', 'Normal', 'High'), по умолчанию = 'Low')). Класс позаботится о преобразовании строки в int за вас, вы никогда не увидите int.

  class ChoiceField(models.IntegerField):
    def __init__(self, choices, **kwargs):
        if not hasattr(choices[0],'__iter__'):
            choices = zip(range(len(choices)), choices)

        self.val2choice = dict(choices)
        self.choice2val = dict((v,k) for k,v in choices)

        kwargs['choices'] = choices
        super(models.IntegerField, self).__init__(**kwargs)

    def to_python(self, value):
        return self.val2choice[value]

    def get_db_prep_value(self, choice):
        return self.choice2val[choice]
7
ответ дан 24 November 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: