2011-10-13 12 views
0

我想混合一个字段到我不想编辑的现有模型中(它来自第三方项目,我宁愿不改变项目)。我创建了一个简单的例子,它说明了我正在尝试但无法执行的操作:混合字段到现有的和不可编辑的Django模型

在一个空的Django项目中,我创建了应用程序app1和app2(它们在设置中按顺序排列)。他们看起来像下面这样:

app1.models.py:

from django.db import models 
from app2.models import BlogPost 

class BlogPostExtend(models.Model): 
    custom_field_name = models.CharField(max_length=200) 

    class Meta: 
     abstract = True 

BlogPost.__bases__ = (BlogPostExtend,)+BlogPost.__bases__ # this prevents MRO error 

app2.models.py:

from django.db import models 

class BlogPost(models.Model): 
    field_name = models.CharField(max_length=100) 

不幸的是这不会导致custom_field_name在数据库创建时,我syncdb,尽管在命令行输入BlogPost.custom_field_name,但它确实将它识别为CharField。我知道在这种简单的情况下,我可以从BlogPostExtend继承BlogPost,但在实际使用情况下,我无法编辑BlogPost。

这是一个非常简单的例子,但它说明了我正在尝试做什么。

谢谢!

回答

0

Mixins很适合添加属性和方法,但不能添加字段。

app1.models.py,而是执行此操作:

from django.db import models 
from app2.models import BlogPost 

custom_field_name = models.CharField(max_length=200) 
custom_field_name.contribute_to_class(BlogPost, "custom_field_name") 

我觉得也是app1应用应该来app2INSTALLED_APPS这个工作。

Here is an explanation on contribute_to_class

+0

感谢您的答案,它确实有效。我不会接受它,因为我真的想找到一种方法来用mixin来做到这一点,但这可能是唯一的方法。谢谢。 – joshcartme

相关问题