2009-07-06 21 views
29

Sto scrivendo un mixin che consentirà ai miei modelli di essere facilmente tradotti in un profondo valore di valori (un po 'come .values ​​(), ma attraversando le relazioni). Il posto più pulito di fare le definizioni di questi sembra essere nei modelli stessi, a la:Aggiunta di attributi nella classe Meta di Django Model

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' 
    } 
} 

Tuttavia, Django lamenta il mio compreso questo in class Meta con:

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

(intero stack trace here)

Ora, suppongo di poterlo sovrascrivere nel mio mixin, ma esiste un modo più elegante di archiviare queste informazioni?

risposta

45

Non so circa elegante, ma in un modo pragmatico è:

import django.db.models.options as options 

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

Ovviamente, questo avrebbe rotto se Django mai aggiunto un attributo di 'schema' a sé stante. Ma hey, è un pensiero ... puoi sempre scegliere un nome di attributo che è meno probabile che si scontrino.

+5

Per i posteri, questo non funziona, ma questo ha fatto: options.DEFAULT_NAMES = options.DEFAULT_NAMES + ('default_values',) –

+2

Oh ... è presumibilmente perché la mia soluzione converte DEFAULT_NAMES in una lista, mentre il tuo raffinamento lo mantiene come una tupla. –

+0

Molto probabilmente! :) –

Problemi correlati