2011-09-01 80 views
6

我试图创建一个Django ORM映射,它与现有的data model兼容,所以我尝试使用现有的一组表和列名。Django多表继承:指定自定义的一对一列名

我有一个多表继承情况,其中一个类的信息对象派生自类对象。我想,让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自动奇迹般用于多表继承?

另一种选择,我将不得不以其他方式使用,是使用一个明确的一到一个领域,但后来我将不能够从对象模型继承非数据库的方法:

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

你最后的想法是非常稳固:创造对他们俩的公共基类,并把它作为一个mixin提供你正在寻找额外的功能。我建议将它作为一个实验来尝试。 (它可能行不通; Django的数据库层在Python的元类中做了一些相当不错的事情,但值得一试。) –

回答

8

django docs(开发版本):

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

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