8

我正在尝试创建与现有数据模型兼容的 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")  

有任何想法吗?也许我可以为它们创建一个公共基类并将非数据库方法放在那里......?

4

2 回答 2

9

来自django 文档(开发版):

如前所述,Django 将自动创建一个 OneToOneField 将您的子类链接回任何非抽象父模型。如果要控制链接回父类的属性的名称,可以创建自己的 OneToOneField 并设置 parent_link=True 以指示您的字段是链接回父类。

于 2011-10-04T08:52:56.137 回答
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
于 2013-02-20T06:34:52.420 回答