我想将一个字段混合到一个我不想编辑的现有模型中(它来自第三方项目,我宁愿让项目不受影响)。我创建了一个简单的例子来说明我正在尝试但无法做到的事情:
在一个空的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。
这是一个非常简化的例子,但它说明了我想要做的事情。
谢谢!
答案 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
之后才能实现。