Я начал экспериментировать с django-mutant 0.0.2
(на django 1.4.2
), но из-за отсутствия документации я получил почти нигде. То, как я понял в описании проекта, я мог использовать его для динамического создания моих моделей, поэтому я подумал, что смогу подключить его с помощью интерфейса django-admin
, поэтому я могу создать модели и определить там все поля. Я видел некоторые другие альтернативы, такие как django-eav
, dynamo
, Will Hardy dynamic-models
и т.д., Но похоже, что это лучшая реализация до сих пор, поэтому я решил использовать это.
Я положил это в 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
)
Я открыл источник django-mutant
, чтобы выяснить, что мне делать, и я подумал, что достаточно импортировать mutant.models.ModelDefinition
и mutant.models.FieldDefinition
в my admin.py
и зарегистрировать их, поэтому я попробовал это:
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)
После syncdb я получил его, и я получил раздел "мутант" в моем интерфейсе администратора, внутри него "Определение моделей" и "Поля". Я успешно добавил модель, хотя я не мог указать любое имя приложения, которое находится в списке INSTALLED_APPS
. Добавление поля сильно сработало, для него параметр Model def
я выбрал ранее созданную модель (она была единственной в списке), и я выбрал "Определение целых полей" для Content type
. Нажатие кнопки сохранения дало мне следующее:
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
Так может быть, я не могу определить мои поля (или даже модели?). На странице проекта есть фрагмент, который подклассифицирует класс FieldDefinition
, создавая DateFieldDefinition, если я поместил этот фрагмент в свой models.py
и зарегистрировать этот класс в моем админе, я могу добавить любые типы полей успешно. Означает ли это, что я должен подклассировать все типы полей, которые я хочу использовать, чтобы их можно было создать в admin? Действительно ли они связаны с моей моделью, когда я их создаю? Есть ли где-то рабочий пример, чтобы показать хотя бы основы?
Извините, это была самая короткая версия, которую я мог придумать, любое предложение было бы оценено.
UPDATE: Я допустил ошибку при указании версии, которую я пытался, я получил NotImplementedError для последней версии dev (кстати, это 0.0.2), но когда я попробовал реальный 0.0.2, полученный от PyPi так же, как и dev, я получил ошибку формы без сообщения об ошибке, но что-то не удалось проверить. Поэтому, как правило, я не ближе к решению.
UPDATE2: Я зарегистрировал базовые типы мутантов динамически в admin, и теперь я могу добавлять/изменять/удалять модели и поля с помощью этого фрагмента 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)
Однако, когда я проверяю фактические данные в моей базе данных из консоли mysql, например, моя таблица отсутствует в базе данных. Существуют мутантные таблицы, и они содержат записи о моей модели и моих полях, но я подумал, что как только класс динамической модели будет построен, он также будет записан в базу данных, как есть.
Update3: На самом деле я ошибся, таблица найдена в моей базе данных, она просто префикс "mutant_", поэтому я ее не узнал. Похоже, что это будет действительный метод работы с ним, хотя для обеспечения удобного для пользователя интерфейса для работы с ним потребуется больше работы.