Django 外键 on_delete = SET_NULL 不起作用

问题描述

我正在为多个对象模型编写测试,但以下测试未给出预期结果:

def test_image_on_delete(self):
    image = Image(id=self.TEST_IMAGE_ID,name=self.TEST_IMAGE_NAME,src=self.TEST_IMAGE_SRC)
    image.save()
    category = Category.objects.get(id=self.TEST_ID)
    category.image = Image.objects.get(id=self.TEST_IMAGE_ID)
    Image.objects.get(id=self.TEST_IMAGE_ID).delete()
    self.assertIsNone(category.image)

这是类别中的图像字段:

image = ForeignKey(Image,on_delete=SET_NULL,null=True)

我已经确认图像正在被删除,但是 assertIsNone 失败,因为类别的图像字段没有被清除。

我编写此测试或外键字段的方式有问题吗?

注意:我正在使用 django.test 中的 TestCase

解决方法

我发现了这个问题。 on_delete 修改了我的 Category 对象的 SAVED 版本,所以我在本地拥有的变量的副本没有改变。

这是我通过的修改后的测试:

def test_image_on_delete(self):
    image = Image(id=self.TEST_IMAGE_ID,name=self.TEST_IMAGE_NAME,src=self.TEST_IMAGE_SRC)
    image.save()
    category = Category.objects.get(id=self.TEST_ID)
    category.image = Image.objects.get(id=self.TEST_IMAGE_ID)
    self.assertIsNotNone(category.image)
    category.save()
    Image.objects.get(id=self.TEST_IMAGE_ID).delete()
    category = Category.objects.get(id=self.TEST_ID)
    self.assertIsNone(category.image)