and*_*ean 15 python django dynamic django-models models
我开始尝试django-mutant 0.0.2(上django 1.4.2),但由于缺乏文档,我几乎无处可去.我通过项目描述理解的方式我可以用它来动态创建我的模型,所以我认为我可以用django-admin界面连接它,所以我可以创建模型并在那里定义它的所有字段.我看到像一些其他的替代品django-eav,dynamo威尔·哈代的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
)
Run Code Online (Sandbox Code Playgroud)
我打开了django-mutant找出我应该做什么的来源,我认为这足以导入mutant.models.ModelDefinition并mutant.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)
Run Code Online (Sandbox Code Playgroud)
在syncdb之后,我让它运行了,我的管理界面中有一个"突变"部分,里面有"模型定义"和"字段".我成功添加了一个模型,虽然我无法指定列表中的任何appname 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
Run Code Online (Sandbox Code Playgroud)
所以它可能不是我应该定义我的字段(甚至模型?)的方式..在项目的页面上有一个片段,它继承FieldDefinition类,创建一个DateFieldDefinition,如果我将该片段放入我的models.py并在我的注册该类中admin,我可以成功添加任何类型的字段.这是否意味着我必须子类化我想要使用的所有字段类型才能在管理员中创建它们?当我以这种方式创建它们时,它们实际上是否与我的模型绑定?是否有某个工作示例至少显示基础知识?对不起,这是我能提出的最短版本,任何建议都将不胜感激.
更新: 我在指定我正在尝试的版本时犯了一个错误,我得到了最新开发版本的NotImplementedError(顺便说一下也是0.0.2),但是当我尝试从PyPi以相同的方式获得真正的0.0.2作为开发人员,我得到了一个没有错误消息的表单错误,但是在验证时肯定失败了.所以一般来说我并不接近解决方案.
UPDATE2: 我在管理员中动态注册了突变体的基本字段类型,现在我可以用这个管理片段添加/更改/删除模型和字段:
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)
Run Code Online (Sandbox Code Playgroud)
但是,当我从mysql控制台检查数据库中的实际数据时,我的表在数据库中不存在.有突变体的表,它们包含关于我的模型和我的字段的条目,但我认为一旦动态模型类被构造,它也将被原样写入数据库.
UPDATE3: 其实我错了,表在我的数据库中找到,它只是以"mutant_"为前缀,所以我不认识它就在那里.看起来这将是一个有效的方法来使用它,虽然为了使用一个体面的用户友好的界面将需要更多的工作.
好吧,我很抱歉,但是我太忙了(而且可能更懒)完成像我说的那样体面的应用程序.但是为了帮助至少一点,我创建了一个关于该主题的脏博客文章,并添加了一个示例CRUD应用程序用于突变,但要注意,它真的非常基本,只是为了演示启动和运行的前几个步骤.
http://integricho.github.io/2013/07/22/mutant-introduction/
https://github.com/integricho/mutant-sample-app