2017-06-12 5 views
0

私は別のモデルでM2Mを持つモデルを持っています。このように:ManyToMany関係でオブジェクトを削除した後にデータを保持

class Author(models.Model): 
    name = models.CharField(max_length=50) 

class Book(models.Model): 
    author = models.ManyToManyField("Author") 

私はBookオブジェクトに追加されたAuthorからオブジェクトを削除しても、中間テーブル内のデータを保存しておきたいです。 Foreign Keyフィールドのように、on_delete=models.DO_NOTHINGがあります。

私はDjangoにこの「機能」はないと思います。

私がAuthor.objects.all()。delete()を実行するたびに、Booksのフィールド作成者は空になります。私はそれらを空にしたくありません。 delete()の前にデータを保持したい。

私はこれをやりたいのは、私がフィードを受け取り、このフィードのサマリーを行うからです。彼らは更新される可能性があり、私はデータをチェックし続けたくないので、私は作成者からオブジェクトを削除します。削除が簡単で、データはPKを変更するものではありません。

+0

削除する前のデータを保持したい場合は、削除しないでください。私が理解しているように、あなたのステートメントは太字で表示されますが、削除の定義によっては不可能です。すでに保存しているオブジェクトを更新し、必要に応じて取得する必要があります。 – Neelik

+0

@Neelik、何もできません。利用可能な時間、労力、リソースの問題です。私は1つの解決策に取り組んでいて、うまくいけば投稿します... – mk2

+0

私はあなたの解決策を見たいと思うでしょう。私の提案は、あなたのフィードにその変更を伝えることができるAuthorモデルに投稿保存信号を追加することです。これにより、最新の情報を維持し、削除を防ぐことができます。あなたの状況で、削除が必要な理由について私は興味がありますか? – Neelik

答えて

0

私はそれを動作させることができました。

まず、私は新しい中間テーブルを使用してデータを再移植正しい新しいフィールド

class Book(models.Model): 
    author = models.ManyToManyField("Author", through="Inventory") 

でブックを置換された1つの中間テーブル

class Inventory(models.Model): 
    author = models.ForeignKey("Author", on_delete=models.CASCADE) 
    book = models.ForeignKey("Book", on_delete=models.CASCADE) 

を作成しました。今

面白い部分:データを削除する前に

は、私は私のデータを保存するには、次のコマンドを実行しました:

./manage.py dumpdata myapp.Inventory > myinventory.json 

その後、私は

Author.objects.all().delete() 
Book.objects.all().delete() 
と私の著者/ブックのデータを削除

ETLで自分のデータを再作成し、次のコマンドを実行しました。

./manage.py loaddata myinventory.json 

そしてvoilà!新しいデータをもう一度!

関連する問題