1

このトピックでは、必要がない場合に、関連するオブジェクトのカスケード削除を防ぐための良い方法を見つけました。

class Factures(models.Model):
    idFacture = models.IntegerField(primary_key=True)
    idLettrage = models.ForeignKey('Lettrage', db_column='idLettrage', null=True, blank=True)

class Paiements(models.Model):
   idPaiement = models.IntegerField(primary_key=True)
   idLettrage = models.ForeignKey('Lettrage', db_column='idLettrage', null=True, blank=True)

class Lettrage(models.Model):
   idLettrage = models.IntegerField(primary_key=True)

   def delete(self):
      """Dettaches factures and paiements from current lettre before deleting"""
      self.factures_set.clear()
      self.paiements_set.clear()
      super(Lettrage, self).delete()

ただし、「related_name」パラメータでForeignKeyフィールドを使用している場合、このメソッドは失敗するようです。私のように、「clear()」メソッドは正常に機能し、「関連付け解除された」オブジェクトのインスタンスを保存します。しかし、削除している間、djangoはこのオブジェクトの別の記憶されたコピーを使用します。それはまだオブジェクトに関連付けられているため、削除しようとしています-whooooosh!...親戚にさようなら:)

データベースは私の前にアーキテクチャ化されていて、やや奇妙な方法で作成されていたため、これらの「related_names」を妥当な時間内にエスケープすることはできません。誰かがそのようなトラブルの回避策について聞いたことがありますか?

4

1 に答える 1

2

オブジェクトをもう一度読み直して削除するのはどうですか?

to_delete = self.__class__.objects.get(pk=self.pk)
to_delete.delete()

そうすれば、削除されたオブジェクトは新しい新しいコピーになります。delete()問題は、シグナルの呼び出し、正しい値の戻りなど、元のメソッドが実行しなければならない他のすべてのことを適切に実行することです...

于 2010-08-06T18:26:06.820 に答える