Django-mutant создает модели в django-admin - программирование
Подтвердить что ты не робот

Django-mutant создает модели в django-admin

Я начал экспериментировать с 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_", поэтому я ее не узнал. Похоже, что это будет действительный метод работы с ним, хотя для обеспечения удобного для пользователя интерфейса для работы с ним потребуется больше работы.

4b9b3361

Ответ 1

Хорошо, извините, но я слишком занят (и, вероятно, более ленив), чтобы закончить приличное приложение, как я уже сказал. Но, по крайней мере, чтобы помочь, я создал грязное сообщение в блоге по этой теме и добавил пример CRUD-приложения для мутанта, но будьте осторожны, он действительно действительно базовый, только чтобы продемонстрировать первые несколько шагов, чтобы встать и работать.

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

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