Zacząłem eksperymentować z django-mutant 0.0.2
(na django 1.4.2
), ale z powodu braku dokumentacji dotarłem prawie nigdzie. Sposób, w jaki zrozumiałam w opisie projektu mógłbym go użyć do dynamicznego tworzenia moich modeli, więc pomyślałem, że mogę go podłączyć do interfejsu django-admin
, więc mogę stworzyć modele i zdefiniować tam wszystkie jego pola. Widziałem inne alternatywy, takie jak django-eav
, dynamo
, Will Hardy's dynamic-models
itp., Ale wydaje mi się, że jest to najlepsze wdrożenie do tej pory, więc pomyślałem, że powinienem to wykorzystać.Django-mutant tworząc modele w django-admin
Wrzuciłem to w 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
)
otworzyłem źródło django-mutant
aby dowiedzieć się, co należy zrobić, a ja myślałem, że to wystarczy, aby zaimportować mutant.models.ModelDefinition
i mutant.models.FieldDefinition
do mojego admin.py
i zarejestrować im, więc próbowałem to:
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)
Po syncdb, mam to działa, i mam sekcję „mutant” w moim interfejsu administratora, wewnątrz niej definicję „modele” i „Fields”. Z powodzeniem dodałem model, chociaż nie mogłem podać nazwy aplikacji, która znajduje się na liście INSTALLED_APPS
. Dodanie pola nie powiodło się, ponieważ podałem parametr, który wcześniej stworzyłem (był to jedyny na liście) i wybrałem "Integer field definition" dla Content type
. Naciśnięcie przycisku zapisać dał mi tak:
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
Więc to nie może być tak powinno definiować moje pola (lub nawet modele?) .. Na stronie projektu znajduje się fragment, który podklas klasy FieldDefinition
, tworząc a DateFieldDefinition, jeśli wstawię ten fragment do mojego models.py
i zarejestruję tę klasę w moim administratorze, mogę pomyślnie dodać dowolny typ pól. Czy to oznacza, że muszę podklasować wszystkie typy pól, których chcę użyć, aby móc je utworzyć w administracji? Czy są one faktycznie związane z moim modelem, kiedy je tworzę w ten sposób? Czy istnieje gdzieś przykład roboczy, aby pokazać przynajmniej podstawy? Przepraszam, że to była najkrótsza wersja, jaką mogłem wymyślić, każda sugestia byłaby doceniona.
UPDATE: popełniłem błąd w określaniu wersję starałem, mam NotImplementedError do najnowszej wersji dev (który jest również 0.0.2 przy okazji), ale kiedy próbowałem prawdziwe 0.0. 2 dostałem od PyPi w taki sam sposób jak dev, dostałem błąd formy bez komunikatu o błędzie, ale coś nie udało się z pewnością zweryfikować. Więc generalnie nie jestem bliższy rozwiązania.
Update2: Zarejestrowałem typy pól baza mutant dynamicznie w admin, i jestem w stanie teraz, aby dodać/zmienić/usunąć modele i pól z tym administratora fragmencie:
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)
Jednak kiedy sprawdzać rzeczywiste dane w mojej bazie danych z konsoli mysql, na przykład moja tabela nie jest obecna w bazie danych. Są tabele mutantów i zawierają one wpisy dotyczące mojego modelu i moich pól, ale pomyślałem, że po skonstruowaniu klasy modelu dynamicznego, zostanie ona również zapisana w bazie danych, tak jak jest.
UPDATE3: Właściwie myliłem, tabela znajduje się w mojej bazy danych, to tylko z przedrostkiem „mutant_” więc nie uznają, że tam jest.Wygląda na to, że będzie to właściwa metoda pracy z nim, chociaż stworzenie przyzwoitego, przyjaznego dla użytkownika interfejsu do działania będzie wymagało więcej pracy.
Proszę odpowiedzieć na własne pytanie. Dzięki – n3storm
Cześć Andrean, jak idziesz do tej pory? Czy możesz udostępnić działający przykład, który używa mutanta django? –
Pracuję nad interfejsem CRUD dla mutanta, ale niestety moja praca pozostawia bardzo mało czasu na projekty poboczne. Jak tylko będę miał działający prototyp, podzielę się tym. – andrean