5

Django のドキュメントでは、次のようにモデル インスタンスをコピーすることを推奨しています。

original.pk = None
original.save()

しかし、「継承を使用する」場合、つまり、モデルのクラスがのサブクラスのサブクラスであるmodels.Model場合は、少し異なる方法で行う必要があります。

具体的には、ドキュメントは次のように述べています。

継承の仕組みにより、pk と id の両方を None に設定する必要があります。

これに類似した例を示します。

original.pk = None
original.id = None
original.save()

これは不器用に思えます。いずれにせよ、何が起こっているのかを理解したいと思います。id継承を使用すると、フィールドも設定する必要があるのはなぜNoneですか? どのような場合でも、すべての Django モデルが継承するわけではありませんmodels.Modelか?

(注: 私は m2m フィールドのコピーに関するドキュメントから少し省略しています。

4

1 に答える 1

8

これは、ここで話しているタイプである MTI (Multiple Table Inheritance) がオブジェクトを複数のテーブルにまたがって格納するためです。次の例を見てください。

class Animal(models.Model):
    ...

class Dog(Animal):
    ...

を作成するDogと、 のすべてのフィールドAnimalが のテーブルに保存され、Animal直接 のフィールドだけがDogのテーブルに保存されますDog。後でルックアップするDogと、Django は両方のテーブルにクエリを実行し、それらをつなぎ合わせます。

ただし、両方のテーブルには主キーが必要であり、Django はAutoFieldそのために s を使用します。これは単純な正の整数フィールドです。だからDogIDがありAnimal、IDがあります。これはメイン ピースであり、の ID は重要ではないためpk、 にはパーツの ID が入力されます。ただし、コピーを作成する場合は、両方の部分をコピーする必要があります。そうしないと、コピーの一部がコピーの独自の部分を取得できません。AnimalDogAnimalDog

于 2012-08-10T15:03:27.057 に答える