2017-06-12 80 views
0

我有一個與另一個模型具有M2M的模型。就像這樣:在ManyToMany關係中刪除對象後保留數據

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

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

我想保持數據的中間表,即使我從加入到Book對象Author刪除的對象。很像外鍵字段有on_delete=models.DO_NOTHING

我不認爲Django有這個'功能'。

每次執行Author.objects.all()。delete()時,Books的字段作者都將變爲空白。我不想讓他們空虛。我想在delete()之前保留數據。

我想這樣做的原因是因爲我收到一個提要,並對該提要做了一個總結。我從作者中刪除對象,因爲它們可能會更新,我不想繼續檢查數據。它更容易刪除,數據不應該改變PK的。

+0

如果您想保留刪除前的數據,請不要刪除它。根據我的理解,您的粗體陳述是不可能的,因爲定義了刪除操作。您應該更新已存儲的對象,並在必要時檢索它們。 – Neelik

+0

@ Neelik,沒有什麼是不可能的。這只是時間,努力和資源的問題。我正在研究一種解決方案,如果它能正常工作,我會發布... – mk2

+0

我很想看到您的解決方案。我的建議是將後保存信號添加到作者模型,該模型可以將該更改傳達給您的Feed。這將允許您保持最新的信息並防止刪除。我很好奇,爲什麼在你的情況下,刪除是必要的? – Neelik

回答

0

我設法讓它工作。

首先,我創建一箇中間表

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

我取代書用正確的新字段

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

我重新填充使用新的中間表中的數據。

現在最有趣的部分:

之前刪除的數據,我跑到下面的命令來保存我的數據:

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

然後,我刪除了我的作者/帳面資產淨值的數據與

Author.objects.all().delete() 
Book.objects.all().delete() 

我用我的ETL重新創建了我的數據並運行以下命令

./manage.py loaddata myinventory.json 

和voilà!新數據又回來了!

相關問題