Search code examples
djangodjango-modelsdjango-testing

Django ForeignKey on_delete = SET_NULL not working


I'm writing tests for several object models and the following test isn't giving the expected result:

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)

Here is the image field in Category:

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

I've confirmed that the Image is being deleted, but the assertIsNone fails because the Category's image field doesn't get cleared.

Is there something wrong with the way I've written this test or the ForeignKey field?

Note: I'm using TestCase from django.test


Solution

  • I figured out the issue. on_delete modifies the SAVED version of my Category object, so the copy of the variable I have locally isn't changed.

    Here's my modified test that passes:

    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)