2017-06-12 78 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à!新数据又回来了!

相关问题