我在使用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对象则保持不变。
答案 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