2012-03-09 4 views
10

Есть ли какая-либо передовая практика в обработке «таблиц поддержки» в Django?Django - Обработка «моделей enum»

Мне не нравится Field.choices, так как он действительно не обеспечивает целостность (он даже не создает контрольные ограничения), поэтому я предпочитаю создавать полномасштабную модель (и часто я нахожу, что добавляю дополнительные поля в таблицу поддержки).

Теперь, если я использую полную модель, я предполагаю, что правильный путь - создать исходный файл данных для содержимого таблицы, но есть ли «правильный путь», чтобы иметь именованные экземпляры строки, скажем. ..

class State(models.Model): 
    name = model.TextField() 

STATES = dict(
    NEW=State.objects.get(pk=0), 
    IN_PROGRESS=State.objects.get(pk=1), 
) 

... или что-то в этом роде.

Что делать Вы используете?

+2

теперь я это от 11 месяцев назад, но вы нашли какую-либо конкретную хорошую практику для этого? Интересно то же самое здесь. – blaze

ответ

8

Django ORM проверяет целостность, если вы указываете атрибут выбора (при вставке/обновлении данных через пользовательские формы).

Вы также можете установить логику проверки на уровень базы данных и использовать поле базы данных ENUM, если вы поддерживаете это.

UPD:

class EnumField(models.Field): 

    def __init__(self, *args, **kwargs): 
     super(EnumField, self).__init__(*args, **kwargs) 
     if not self.choices: 
      raise AttributeError('EnumField requires `choices` attribute.') 

    def db_type(self): 
     return "enum(%s)" % ','.join("'%s'" % k for (k, _) in self.choices) 

GENDER_MALE = 'm' 
GENDER_FEMALE = 'f' 
GENDER_CHOICES = (
    (GENDER_MALE, 'Male'), 
    (GENDER_FEMALE, 'Female'), 
) 


class Person(models.Model): 
    name = models.CharField(max_length=50) 
    gender = EnumField(choices=GENDER_CHOICES) 
+2

Я хочу, чтобы ограничения находились в базе данных, а «перечисления» были полными моделями со своими собственными таблицами. В принципе, мне интересно, как Python/Djangoish создать псевдоним «Python». – alex

+0

Обновлено мой ответ – San4ez

+2

Я предлагаю другое/не указано, тоже! – Ashe

Смежные вопросы