我正在尝试创建一个与现有data model兼容的Django ORM映射,因此我尝试使用现有的一组表名和列名。
我有一个多表继承情况,其中一个类InformationObject派生自Object类。我想让Django以通常的方式处理这个问题:
class Object(models.Model):
class Meta:
db_table = "object"
class InformationObject(Object):
class Meta:
db_table = "information_object"
在这种情况下,Django会自动在继承模型上创建名为 object_ptr_id 的一对一字段。但是,在我被限制使用的模式上,对Object的引用简称为“id”。所以:
有没有办法以某种方式指定Django自动神奇地用于多表继承的列的名称?
替代方案,我将不得不使用,是使用显式的一对一字段,但后来我将无法从Object模型继承非数据库方法:
class Object(models.Model):
class Meta:
db_table = "object"
class InformationObject(models.Model):
class Meta:
db_table = "information_object"
id = models.OneToOneField(Object, primary_key=True, db_column="id")
有什么想法吗?也许我可以为它们创建一个公共基类,并将非db方法放在那里......?
答案 0 :(得分:8)
来自django docs(开发版):
如前所述,Django将自动创建一个OneToOneField,将您的子类链接回任何非抽象的父模型。如果要控制链接回父项的属性的名称,可以创建自己的OneToOneField并设置parent_link = True以指示您的字段是返回父类的链接。
答案 1 :(得分:1)
正如文档中@fusion引用所提到的,如果要在使用模型继承时指定列,则必须创建OneToOneField。继承的字段将在自定义范围和一对一字段中的子类中可用。
class Object(models.Model):
class Meta:
db_table = "object"
column_1 = models.CharField()
class InformationObject(Object):
class Meta:
db_table = "information_object"
# arbitrary property name (parent_link)
parent_link = models.OneToOneField(Object, primary_key=True, db_column="id", parent_link=True)
在这个例子中:
>>> inf_obj = InformationObject.objects.get(pk=1)
>>> print inf_obj.column_1 == inf_obj.parent_link.column_1
True