django-mutant 在 django-admin 中创建模型

Posted

技术标签:

【中文标题】django-mutant 在 django-admin 中创建模型【英文标题】:django-mutant creating models in django-admin 【发布时间】:2012-10-15 17:52:50 【问题描述】:

我开始尝试使用django-mutant 0.0.2(在django 1.4.2),但由于缺乏文档,我几乎一无所获。根据项目描述的理解,我可以使用它来动态创建模型,所以我想我可以将它与django-admin 接口连接起来,这样我就可以创建模型并在那里定义它的所有字段。我看到了其他一些替代方案,例如django-eavdynamo、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.ModelDefinitionmutant.models.FieldDefinition导入我的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)

在同步数据库之后,我让它运行起来,我的管理界面中有一个“突变”部分,里面有一个“模型定义”和“字段”。我成功添加了一个模型,尽管我无法指定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 

所以这可能不是我应该定义我的字段(甚至模型?)的方式。在项目页面上有一个 sn-p 子类FieldDefinition 类,创建一个 DateFieldDefinition,如果我把那个 sn -p 进入我的models.py 并在我的管理员中注册该类,我可以成功添加任何类型的字段。这是否意味着我必须对我想要使用的所有字段类型进行子类化才能在管理员中创建它们?当我以这种方式创建它们时,它们实际上是否绑定到我的模型?是否有一个工作示例可以至少显示基础知识? 抱歉,这是我能想到的最短版本,任何建议都将不胜感激。

更新: 我在指定我正在尝试的版本时犯了一个错误,我得到了最新开发版本的 NotImplementedError(顺便说一下,它也是 0.0.2),但是当我尝试从 PyPi 获得的真正 0.0.2 时,与开发人员,我收到了一个没有错误消息的表单错误,但是在验证时肯定会失败。所以通常我不会更接近解决方案。

更新 2: 我在管理员中动态注册了突变体的基本字段类型,现在我可以使用此管理员 sn-p 添加/更改/删除模型和字段:

from django.contrib import admin

from mutant import models

for field_type in models.FieldDefinitionBase._field_definitions.values():
    attrs = 'model': field_type
    FieldDefAdmin = type('0Admin'.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 控制台检查数据库中的实际数据时,我的表不存在于数据库中。有mutant的表,里面有关于我的模型的条目,还有我的字段,但我想一旦动态模型类构建完成,它也会被原样写入数据库。

更新3: 实际上我错了,该表是在我的数据库中找到的,它只是以“mutant_”为前缀,所以我没有认出它在那里。看起来这将是使用它的有效方法,尽管要制作一个体面的用户友好界面来使用它需要更多的工作。

【问题讨论】:

请回答您自己的问题。谢谢 嗨 Andrean,您的作品目前进展如何?你能分享一个使用 django-mutant 的工作示例吗? 我正在为突变体开发 CRUD 接口,但不幸的是,我的工作留给副项目的时间很少。一旦我有一个工作原型,我会分享它。 嗨 Andrean,有什么新闻,有什么你能够/愿意分享的吗? 【参考方案1】:

好的,很抱歉,我太忙了(而且可能更懒惰),无法像我说的那样完成一个像样的应用程序。但至少为了提供一点帮助,我创建了一篇关于该主题的肮脏博客文章,并添加了一个用于突变体的示例 CRUD 应用程序,但请注意,它真的很基础,只是为了演示启动和运行的前几个步骤。

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

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

【讨论】:

以上是关于django-mutant 在 django-admin 中创建模型的主要内容,如果未能解决你的问题,请参考以下文章

Celery 可以在 Elastic Beanstalk 上运行吗?

Django 第二天 创建Django项目

Django网站开发—— 网站快速搭建

如何为 django 可重用应用程序启动测试?

在 Elastic Beanstalk 上部署后运行 manage.py 命令的正确方法?

Django 将模型转换为 sql 代码