Python Django中所有型号的通用app_标签
我在Python Django中所有型号的通用app_标签,python,django,django-models,Python,Django,Django Models,我在models.py中有很多类,比如: class SomeClass1(BaseModel): question = models.ForeignKey(Question) image = models.ForeignKey(Image) class SomeClass2(BaseModel): question = models.ForeignKey(Question) option_text = models.TextField() 现在,我想在所有这
models.py中有很多类,比如:
class SomeClass1(BaseModel):
question = models.ForeignKey(Question)
image = models.ForeignKey(Image)
class SomeClass2(BaseModel):
question = models.ForeignKey(Question)
option_text = models.TextField()
现在,我想在所有这些类中添加app\u label='my\u app\u label1'
,如下所示:
class SomeClass1(BaseModel):
question = models.ForeignKey(Question)
image = models.ForeignKey(Image)
class Meta:
app_label = 'my_app_label1'
class BaseModel(models.Model):
"""
For future abstraction.
"""
class Meta:
app_label = 'ques_app_data'
但是因为有很多类,所以我不是将app\u label='my\u app\u label1'
添加到所有类中,而是将app\u label='my\u app\u label1'
添加到基本模型中,如下所示:
class SomeClass1(BaseModel):
question = models.ForeignKey(Question)
image = models.ForeignKey(Image)
class Meta:
app_label = 'my_app_label1'
class BaseModel(models.Model):
"""
For future abstraction.
"""
class Meta:
app_label = 'ques_app_data'
在此之后,我将得到以下错误:
myapp.SomeClass1.basemodel_ptr: (fields.E300) Field defines a relation with model 'BaseModel', which is either not installed, or is abstract.
有人能解释一下如何解决这个问题吗?试着在BaseModel
internalMeta
类中指定abstract=True
class BaseModel(models.Model):
"""
For future abstraction.
"""
class Meta:
abstract=True # specify this model as an Abstract Model
app_label = 'ques_app_data'
然后在模型类中继承这个BaseModel
类
所有子模型类都继承父BaseModel
类的Meta
类属性。Django将对抽象基类的Meta
类进行一次调整,在子类中安装Meta
属性之前,它会设置abstract=False
。这样做是为了使抽象基类的子类本身不会自动成为抽象类
完成此操作后,您需要再次运行迁移
注意:您的项目中必须有一个名为ques\u app\u data
的应用程序才能工作 这篇文章回答了这个问题:
有两个要点:
1) 我们一定有
class Meta:
abstract = True
基类
2) app\u label
ques\u app\u数据必须包含在INSTALLED\u APPS
你的app\u名称是否与你传递给app\u label的名称匹配?不匹配,但我想为不同app的型号提供相同的app\u标签。我认为,设置中包含的名称必须相同。试试看。我想给不同应用程序的模型贴上相同的应用程序标签。你为什么要这么做?当您的模型位于django不知道它们属于哪个应用程序的位置时,将使用app_标签。是的,我这样做了,但在此之后,makemigrations没有为子类创建表。您遇到了什么错误?你能发布追踪吗?没有错误。“SomeClass1”的正常执行(不扩展基类)迁移:0003_usersubscription2.py:-创建模型usersubscription2但在扩展基类时,如果迁移是在不进行抽象的情况下运行的,那么为BaseModel
指定不同的名称可能会有所帮助。检查此链接。名字不是BaseModel,而是别的东西