Ho iniziato a sperimentare con django-mutant 0.0.2
(su django 1.4.2
), ma a causa della mancanza di documentazione non ho ottenuto quasi nulla. Il modo in cui ho capito dalla descrizione del progetto l'ho usato per creare i miei modelli in modo dinamico, quindi ho pensato di collegarlo all'interfaccia django-admin
, così posso creare i modelli e definire tutti i suoi campi. Ho visto alcune altre alternative come django-eav
, dynamo
, Will Hardy's dynamic-models
, ecc. Ma sembra che questa sia la migliore implementazione fino ad ora, quindi ho pensato che avrei dovuto usare questo.django-mutant che crea modelli in django-admin
Ho messo questo in settings.py
:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'south',
'polymodels',
'mutant',
'mutant.contrib.boolean',
'mutant.contrib.temporal',
'mutant.contrib.file',
'mutant.contrib.numeric',
'mutant.contrib.text',
'mutant.contrib.web',
'mutant.contrib.related',
'dynamodels' # this is the name of my testapp
)
ho aperto la fonte di django-mutant
per capire cosa devo fare, e ho pensato che basta importare il mutant.models.ModelDefinition
e mutant.models.FieldDefinition
nel mio admin.py
e registrare loro, così ho provato questo:
from django.contrib import admin
from mutant import models
class ModelDefinitionAdmin(admin.ModelAdmin):
pass
admin.site.register(models.ModelDefinition, ModelDefinitionAdmin)
class FieldDefinitionAdmin(admin.ModelAdmin):
pass
admin.site.register(models.FieldDefinition, FieldDefinitionAdmin)
Dopo uno syncdb, ho preso in esecuzione, e ho avuto una sezione "mutante" nella mia interfaccia di amministrazione, al suo interno una "definizione Models" e "campi". Ho aggiunto un modello con successo, sebbene non potessi specificare nessun appname presente nell'elenco di INSTALLED_APPS
. L'aggiunta di un campo non è andata a buon fine, poiché è il parametro Model def
Ho scelto il modello che ho creato in precedenza (era l'unico nell'elenco) e ho scelto "Definizione campo intero" per Content type
. Premendo il pulsante salvare mi ha dato questo:
NotImplementedError at /admin/mutant/fielddefinition/add/
No exception supplied
...
...
/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/field/__init__.py in save
return super(FieldDefinition, self).save(*args, **kwargs) ...
/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_polymodels-1.0.1-py2.6.egg/polymodels/models.py in save
return super(BasePolymorphicModel, self).save(*args, **kwargs) ...
/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in save
self.model_def.model_class(force_create=True) ...
/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in model_class
model_class = self._create_model_class(existing_model_class) ...
/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in _create_model_class
attrs = self.get_model_attrs(existing_model_class) ...
/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in get_model_attrs
for f in self.fielddefinitions.select_subclasses())) ...
/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in <genexpr>
for f in self.fielddefinitions.select_subclasses())) ...
/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/field/__init__.py in field_instance
cls = self.get_field_class() ...
/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/field/__init__.py in get_field_class
raise NotImplementedError
Quindi non può essere il modo in cui avrei dovuto definire i miei campi (o anche modelli?) .. Su page del progetto v'è un frammento, che sottoclassi della classe FieldDefinition
, creando a DateFieldDefinition, se inserisco lo snippet nel mio models.py
e registro quella classe nel mio amministratore, posso aggiungere qualsiasi tipo di campo con successo. Significa che devo creare una sottoclasse di tutti i tipi di campi che voglio utilizzare per poterli creare nell'amministratore? Sono effettivamente legati al mio modello quando li creo in questo modo? C'è un esempio funzionante da qualche parte per mostrare almeno le basi? Mi spiace che questa fosse la versione più corta che avrei potuto trovare, ogni suggerimento sarebbe apprezzato.
UPDATE: Ho fatto un errore nello specificare la versione che cercavo, ho avuto l'NotImplementedError per l'ultima versione dev (che è anche 0.0.2 tra l'altro), ma quando ho provato la vera 0.0. 2 ottenuto da PyPi allo stesso modo dello sviluppatore, ho ricevuto un errore di modulo senza un messaggio di errore, ma sicuramente qualcosa non è riuscito alla validazione. Quindi generalmente non sono più vicino alla soluzione.
UPDATE2: ho registrato i tipi di campo di base di mutanti dinamicamente nel admin, e sono in grado ora di aggiungere/modificare/cancellare i modelli e campi con questa amministrazione frammento:
from django.contrib import admin
from mutant import models
for field_type in models.FieldDefinitionBase._field_definitions.values():
attrs = {'model': field_type}
FieldDefAdmin = type('{0}Admin'.format(field_type.__name__),
(admin.ModelAdmin,),
attrs)
admin.site.register(field_type, FieldDefAdmin)
class ModelDefinitionAdmin(admin.ModelAdmin):
model = models.ModelDefinition
admin.site.register(models.ModelDefinition, ModelDefinitionAdmin)
Tuttavia quando ho ispezionare per esempio, i dati reali nel mio database dalla console mysql, la mia tabella non è presente nel database. Ci sono le tabelle dei mutanti e contengono le voci sul mio modello e sui miei campi, ma ho pensato che una volta costruita la classe del modello dinamico, sarà anche scritta nel database così com'è.
Update3: In realtà mi sbagliavo, la tavola si trova nel mio database, è solo il prefisso "mutant_" così non ho riconosciuto che c'è.Sembra che questo sarà un metodo valido per lavorare con esso, anche se per fare in modo che un'interfaccia user-friendly decente funzioni con esso richiederà più lavoro.
Si prega di rispondere alla tua domanda. Grazie – n3storm
Ciao Andrea, come stanno andando le tue opere? Puoi condividere un esempio funzionante che usi il django-mutante? –
Sto lavorando su un'interfaccia CRUD per mutante, ma sfortunatamente il mio lavoro lascia molto poco tempo per i progetti collaterali. Non appena avrò un prototipo funzionante, lo condividerò. – andrean