在ManyToMany关系中删除对象后保留数据

时间:2017-06-12 20:25:56

标签: python django django-models

我有一个M2M与另一个模型的模型。像这样:

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

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

即使我从Author中删除了添加到Book对象的对象,我仍希望将数据保留在中间表中。就像外键字段有on_delete=models.DO_NOTHING一样。

我不认为Django有这个'功能'。

每次执行Author.objects.all()。delete()时,Books中的字段作者都会变空。我不希望他们是空的。我想在delete()之前保留数据。

我想这样做的原因是因为我收到了一个Feed,并对此Feed做了总结。我删除了作者的对象,因为它们可能会更新,我不想继续检查数据。它更容易删除,数据不应该改变PK。

1 个答案:

答案 0 :(得分: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

瞧!新鲜数据又回来了!