私は既存のものと互換性のあるDjango ORMマッピングを作成しようとしています データ・モデルだから、私は既存のテーブル名とカラム名で作業しようとしています。
私はクラスInformationObjectがクラスObjectから派生したマルチテーブルの継承状況を得ました。私はDjangoにこれを通常の方法で処理させたいと思います:
class Object(models.Model):
class Meta:
db_table = "object"
class InformationObject(Object):
class Meta:
db_table = "information_object"
この場合、Djangoは継承するモデルに1対1のフィールドを自動的に作成します。 object_ptr_id。しかし、私が使用することが制限されているスキーマでは、オブジェクトへの参照は単に "id"と呼ばれます。
Djangoが自動的にマルチテーブルの継承に使用するカラムの名前を何とか指定する方法はありますか?
別の方法で使用する必要がある代替方法は、明示的な1対1フィールドを使用することですが、オブジェクトモデルから非データベースメソッドを継承することはできません。
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メソッドをそこに置くことができます...?
回答:
回答№1は8から djangoドキュメント (開発版):
前述のように、Djangoは自動的に子クラスを非抽象親モデルに戻すOneToOneField。親に戻る属性の名前を制御する場合は、独自のOneToOneFieldを作成し、parent_link = Trueを設定して、フィールドが親クラスへのリンクであることを示すことができます。
回答№2の場合は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