djangoでモデルの継承を処理する場合、スーパークラス自体を削除せずに、モデルサブクラスのインスタンスを削除することは可能ですか?
Djangoの例を使用して、オブジェクトだけを削除してResturaunt
オブジェクトを保持できPlace
ますか?
djangoでモデルの継承を処理する場合、スーパークラス自体を削除せずに、モデルサブクラスのインスタンスを削除することは可能ですか?
Djangoの例を使用して、オブジェクトだけを削除してResturaunt
オブジェクトを保持できPlace
ますか?
昨日、私はこの質問に対する答えを探していました。この解決策を思いつきました。これは私の問題には十分でしたが、必要に応じてスケールアップすることができました。
レストランとプレイスのdjangoモデルがあるとすると、プレイスのテーブル内の行に触れずにレストランを削除する方法は、次のような「偽の」レストランモデルを作成することです。
class FakeRestaurant(models.Model):
place_ptr = models.PositiveIntegerField(db_column="place_ptr_id", primary_key=True)
serves_hot_dogs = models.BooleanField()
serves_pizza = models.BooleanField()
class Meta:
app_label = Restaurant._meta.app_label
db_table = Restaurant._meta.db_table
managed = False
これで、バインドされた外部関係がないかのように、そのテーブルからオブジェクトを取得できます。
place = Place.objects.get(pk=1)
restaurant = Restaurant.objects.get(pk=1)
fake_restaurant = FakeRestaurant.objects.get(pk=1)
fake_restaurant.delete()
fake_restaurantとrestaurantはもう存在せず、場所はそのまま残ります。
乾杯、ダビデ
Django 1.9では、keep_parents
モデルdelete()
関数にパラメーターが追加されたため、親を維持するには、次のコマンドを呼び出すだけです。
restaurant.delete(keep_parents=True)
ドキュメント:https ://docs.djangoproject.com/en/1.10/ref/models/instances/#django.db.models.Model.delete
アップデート:
どうやら、この機能はDjango1.9では正しく機能していません。コメントを参照してください。