2012-10-25 3 views
14

J'ai commencé à expérimenter avec django-mutant 0.0.2 (sur django 1.4.2), mais en raison du manque de documentation je n'ai presque nulle part. La façon dont j'ai compris la description du projet, je pourrais l'utiliser pour créer mes modèles dynamiquement, donc j'ai pensé que je peux le câbler avec l'interface django-admin, donc je peux créer les modèles et définir tous ses champs là. J'ai vu d'autres alternatives comme django-eav, dynamo, dynamic-models de Will Hardy, etc. mais il semble que ce soit la meilleure implémentation jusqu'à présent, alors j'ai pensé que je devrais l'utiliser.django-mutant créer des modèles dans django-admin

J'ai mis cela en 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 
) 

J'ai ouvert la source de django-mutant pour comprendre ce que dois-je faire, et je pensais que il suffit d'importer le mutant.models.ModelDefinition et mutant.models.FieldDefinition dans mon admin.py et inscrivez-vous eux, alors j'ai essayé ceci:

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) 

Après une syncdb, je l'ai eu en cours d'exécution, et je suis arrivé une section « mutant » dans mon interface d'administration, à l'intérieur d'une « définition de modèles » et « champs ». J'ai ajouté un modèle avec succès, bien que je ne puisse pas spécifier n'importe quel appname qui est dans la liste de INSTALLED_APPS. L'ajout d'un champ a échoué, car c'est le paramètre Model def que j'ai choisi le modèle que j'ai créé auparavant (c'était le seul sur la liste), et j'ai choisi "Définition du champ entier" pour Content type. Frapper sur le bouton Enregistrer m'a donné ceci:

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 

Il peut ne pas être la façon dont je devrais définir mes champs (ou même des modèles?) .. Sur la page du projet il y a un extrait qui sous-classe de la classe FieldDefinition, la création un DateFieldDefinition, si je mets cet extrait dans mon models.py et que j'inscris cette classe dans mon admin, je peux ajouter n'importe quel type de champs avec succès. Cela signifie-t-il que je dois sous-classer tous les types de champs que je veux utiliser pour pouvoir les créer dans l'admin? Sont-ils réellement liés à mon modèle quand je les crée de cette façon? Existe-t-il un exemple de travail pour montrer au moins les bases? Désolé, c'était la version la plus courte que je pouvais trouver, toute suggestion serait appréciée.

MISE À JOUR: je fait une erreur en spécifiant la version que je voulais, je suis le NotImplementedError pour la dernière version dev (qui est aussi 0.0.2 par la voie), mais quand j'ai essayé la vraie 0.0. 2 obtenu de PyPi de la même manière que le dev, j'ai eu une erreur de forme sans un message d'erreur, mais quelque chose a échoué à la validation définitivement. Donc, en général, je ne suis pas plus proche de la solution.

MAJ2: Je me suis inscrit les types de champs de base de mutants dynamiquement dans l'admin, et je peux maintenant ajouter/modifier/supprimer des modèles et des champs avec cet extrait de admin:

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) 

Cependant, lorsque je visite les données réelles dans ma base de données de la console mysql par exemple, ma table n'est pas présente dans la base de données. Il y a des tables de mutants, et elles contiennent les entrées sur mon modèle et mes champs, mais je pensais qu'une fois la classe de modèle dynamique construite, elle serait également écrite dans la base de données telle qu'elle est.

Update3: En fait, je me suis trompé, la table se trouve dans ma base de données, il est juste préfixé par « mutant_ » donc je ne reconnais qu'il est là.On dirait que ce sera une méthode valable pour travailler avec, bien que pour faire une interface conviviale décente pour fonctionner avec elle nécessitera plus de travail.

+9

S'il vous plaît répondre à votre propre question. Merci – n3storm

+0

Salut Andrean, comment vont tes travaux jusqu'ici? Pouvez-vous partager un exemple de travail qui utilise django-mutant? –

+0

Im travaillant sur une interface CRUD pour mutant, mais malheureusement mon travail laisse très peu de temps pour les projets secondaires. Dès que j'ai un prototype fonctionnel, je le partagerai. – andrean

Répondre

5

Ok, je suis désolé mais je suis trop occupé (et probablement beaucoup plus paresseux) pour compléter une application décente comme je l'ai dit. Mais pour aider au moins un peu, j'ai créé un post de blog sale sur le sujet, et ajouté un exemple d'application CRUD pour mutant, mais attention, c'est vraiment vraiment basique, seulement pour démontrer les premières étapes pour démarrer et courir.

http://integricho.github.io/2013/07/22/mutant-introduction/

https://github.com/integricho/mutant-sample-app

Questions connexes