1

Djangoモデルの設計と、カスケード削除への影響の検討について一般的な質問があります。資産管理アプリの次の単純な設計を想定します。

class Asset(models.Model):
    aquire_date = models.DateField()
    cost = models.DecimalField(max_digits=16, decimal_places=2)
    description = models.CharField(max_length=30)
    account = models.ForeignKey(Account)
    vendor = models.ForeignKey(Vendor)
    department = models.ForeignKey(Department)

class Vendor(models.Model):
    name = models.CharField(max_length=70)
    city = models.CharField(max_length=50
    phone = PhoneNumberField()
    email = models.EmailField()

class Account(models.Model):
    account_number = models.IntegerField()
    description = models.CharField(max_length=50)

class Department(models.Model):
    number = models.IntegerField(unique=True)
    name = models.CharField(max_length=50)

したがって、各アセットには、他のテーブルへの3つのForeignKeyフィールドがあります。Djangoのドキュメントを読むと、 「削除するオブジェクトを指す外部キーを持つオブジェクトは、一緒に削除されます」と書かれています。これは、Departmentオブジェクト、Assetオブジェクト、またはオブジェクトを削除すると、ForeignKeyが参照しているオブジェクトも削除されることを意味します。ただし、アセットを削除しても、部門、ベンダー、およびアカウントは残ります。

それはDjangoでのカスケード削除を理解する正しい方法ですか?

私が好むのは

  • 資産が削除されても、部門、ベンダー、またはアカウントは削除されません。
  • 部門が削除されると、アセットは削除されませんが、その部門を指すすべてのForeignKeyフィールドはnullに設定されます。

それは可能ですか?

4

1 に答える 1

2

はい、あなたの理解は正しいです。

解決策:モデルForeignKeyフィールドを作成するときに、を指定しon_delete=django.db.models.SET_NULLます。null=Trueデフォルトはですので、これを許可するには、これをと組み合わせる必要がありますFalse

于 2013-02-02T03:47:40.603 に答える