2012-03-09 26 views
10

¿Existe alguna mejor práctica en el manejo de "tablas de soporte" en Django?Django - Manejo de "modelos enum"

No me gusta Field.choices, ya que realmente no impone la integridad (ni siquiera crea restricciones de verificación), por lo que prefiero crear un modelo completo (y, a menudo, me encuentro agregando campos adicionales en la tabla de soporte)

Ahora, si utilizo un modelo completo, supongo que el camino correcto es crear un elemento de datos inicial para el contenido de la tabla, pero ¿hay una "manera correcta" de tener instancias con nombre de la fila, por ejemplo. ..

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

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

... o algo por el estilo.

¿Qué usa usar?

+2

que ahora esto es de hace 11 meses, pero no se encontró ninguna buena práctica en particular para esto? Preguntándose lo mismo aquí. – blaze

Respuesta

8

Django ORM comprueba la integridad si especifica el atributo de opciones (cuando inserta/actualiza datos a través de formularios de usuario).

También puede establecer la lógica de validación a nivel de base de datos y usar el campo ENUM de la base de datos si db lo admite.

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

Quiero que las restricciones estén en la base de datos y que las "enumeraciones" sean modelos completos con sus propias tablas. Básicamente, me pregunto acerca de la forma Pythonic/Djangoish para crear la enumeración "Python". – alex

+0

Actualizado mi respuesta – San4ez

+2

Sugiero Otro/Sin especificar, también! – Ashe