Mixin Field成为现有和不可编辑的django模型

时间:2011-10-13 19:10:50

标签: python django mixins

我想将一个字段混合到一个我不想编辑的现有模型中(它来自第三方项目,我宁愿让项目不受影响)。我创建了一个简单的例子来说明我正在尝试但无法做到的事情:

在一个空的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)

不幸的是,当我同步dbdb时,这不会导致在数据库中创建custom_field_name,但是在命令行中,如果我键入BlogPost.custom_field_name,它会将其识别为CharField。我知道在这个简单的例子中我可以从BlogPostExtend继承BlogPost,但在实际用例中我无法编辑BlogPost。

这是一个非常简化的例子,但它说明了我想要做的事情。

谢谢!

1 个答案:

答案 0 :(得分: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应用也应该在app2 INSTALLED_APPS之后才能实现。

Here is an explanation on contribute_to_class