2009-07-06 23 views
29

Estoy escribiendo un mixin que permitirá que mis modelos se traduzcan fácilmente a un dict profundo de valores (algo así como .values ​​(), pero atravesando relaciones). El lugar más limpio que ver las definiciones de estos parece estar en los propios modelos, al estilo de:Agregando atributos a la clase meta del modelo Django

class Person(models.Model, DeepValues): 
    name = models.CharField(blank=True, max_length=100) 
    tribe = models.ForeignKey('Tribes') 

    class Meta: 
     schema = { 
      'name' : str, 
      'tribe' : { 
       'name' : str 
      } 
     } 

Person.objects.all().deep_values() => { 
    'name' : 'Andrey Fedorov', 
    'tribe' : { 
     'name' : 'Mohicans' 
    } 
} 

Sin embargo, Django se queja de mi inclusión dentro de class Meta con:

TypeError: 'class Meta' got invalid attribute(s): schema 

(toda traza de la pila here)

Ahora, supongo que podría anular cuidadosamente esto en mi mixin, pero ¿hay alguna forma más elegante de almacenar esta información?

Respuesta

45

No sé acerca elegante, pero de una manera pragmática es:

import django.db.models.options as options 

options.DEFAULT_NAMES = options.DEFAULT_NAMES + ('schema',) 

Obviamente, esto rompería si alguna vez Django agrega un atributo 'esquema' de su propia. Pero bueno, es un pensamiento ... siempre puedes elegir un nombre de atributo que es menos probable que choque.

+5

Por la posteridad, eso no funciona, pero esto fue así: options.DEFAULT_NAMES = options.DEFAULT_NAMES + ('default_values',) –

+2

Oh ... es presumible porque mi solución convierte DEFAULT_NAMES a una lista, mientras que su refinamiento lo mantiene como una tupla. –

+0

¡Lo más probable! :) –

Cuestiones relacionadas