2011-09-01 7 views
6

既存のdata modelと互換性のあるDjango ORMマッピングを作成しようとしていますので、既存のテーブルとカラムのセットを使用しようとしています名前。Djangoマルチテーブル継承:カスタム1対1の列名を指定

クラスインフォメーションオブジェクトがクラスオブジェクトから派生したマルチテーブル継承状況があります。 Djangoが自動的にをobject_ptr_idと呼ばれる継承モデルに一対一のフィールドを作成します。この場合

class Object(models.Model): 
    class Meta: 
     db_table = "object"   

class InformationObject(Object): 
    class Meta: 
     db_table = "information_object" 

:私は、Djangoはこのに通常の方法を処理できるようにしたいと思います。しかし、私が使用することが制限されているスキーマでは、オブジェクトへの参照は単に "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メソッドをそこに置くことができます...? django docs(開発版)から

+0

あなたの最後のアイデアはかなりしっかりしている:それらの両方のための共通の基底クラスを作成し、あなたが探しているの余分な機能を提供するために、ミックスインとしてそれを使用します。私は実験として試してみることをお勧めします。 (これはうまくいかないかもしれません; Djangoのデータベース層は、Pythonのメタクラスでかなりのことを行いますが、試してみる価値があります)。 –

答えて

8

述べたように、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 
関連する問題