Django删除SET_NULL

时间:2018-08-06 09:43:32

标签: django python-3.x django-models

我在使用ForeignKey和on_delete=SET_NULL时遇到问题。

在删除我的last_data模型中引用的Stuff时,它也会删除填充对象,就像这是一个级联一样,这显然不是我期望的,而是设置了{{1} }字段为null。

这是在两个不同的Django应用中定义我的模型的方式。

last_data

我必须误解了它是如何链接的,我想要的是在删除数据时永远不会删除填充对象,但是当发生这种情况时,它所引用的# App 1 class Device(models.Model): last_data = models.ForeignKey('Data', null=True, blank=True, related_name="last_data_device", on_delete=models.SET_NULL, help_text="Latest data") class Data(models.Model): content = models.CharField(max_length=255) date_created = models.DateTimeField(blank=True, null=False, db_index=True) device = models.ForeignKey(Device, related_name="data", db_index=True, on_delete=models.CASCADE) # App 2 class Stuff(models.Model): device = models.OneToOneField(Device, null=True, blank=True, related_name="stuff", db_index=True, on_delete=models.CASCADE) last_data = models.ForeignKey(Data, null=True, blank=True, help_text="Latest data", db_index=True, on_delete=models.SET_NULL) 可能会为空。

我应该怎么写?或者我在这里做错了什么?
谢谢

PS:迁移是最新的,并且数据库已同步。


好吧,已经找到答案了,看来我应该澄清一下。

当我这样做时:

last_data

这是东西对象,被删除为“依赖项”,我不明白为什么。
我期望的是>>> stuff = Stuff.objects.get(...) >>> stuff.last_data.delete() 字段为空,而stuff对象则保持不变。

3 个答案:

答案 0 :(得分:0)

更改为models.DO_NOTHING。这样可以避免删除。

答案 1 :(得分:0)

这也许是由于通信OneToOneField。如果您删除Stuff模型中引用的last_data,则设备将OneToOne与设备连接在一起。您可以在OneToOne字段上设置on_delete = models.SET_NULL

答案 2 :(得分:0)

如果我的理解正确,那么您的问题就是这样做的时候:

>>> stuff = Stuff.objects.get(...)
>>> stuff.last_data.delete()

然后,相应的数据记录也将从数据库中删除。

这是预料之中的,这是它应该如何工作的。如果您只想将last_data设置为NULL,同时保持数据表不变,则:

>>> stuff.last_data = None
>>> stuff.save()

on_delete=SET_NULL的目的是支持相反的用例:当您删除数据记录时,所有指向该数据的Stuff记录都将获得其{{1} }设置为last_data

NULL