问题
I have two models connected via a ForeignKey sort of like this:
class Album(models.Model):
name = models.CharField(max_length=128)
# ...
class Track(models.Model):
name = models.CharField(max_length=128)
album = models.ForeignKey(Album, related_name='tracks', null=True, on_delete=models.SET_NULL)
# ...
I'm writing a data migration where I try to delete some Albums:
# -*- coding: utf-8 -*-
# Generated by Django 1.9.13 on 2018-12-12 14:05
from __future__ import unicode_literals
from django.db import migrations
def forwards_func(apps, schema_editor):
Album = apps.get_model("myapp", "Album")
db_alias = schema_editor.connection.alias
for album in Album.objects.using(db_alias).filter(foo='bar'):
album.delete()
def reverse_func(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('myapp', '0049_blabla'),
]
operations = [
migrations.RunPython(forwards_func, reverse_func),
]
However, I am getting this error:
File "/usr/local/lib/python2.7/site-packages/django/db/backends/base/base.py", line 211, in _commit
return self.connection.commit()
IntegrityError: update or delete on table "Album" violates foreign key constraint "f2274d6f2be82bbff458f3e5487b1864" on table "Track"
DETAIL: Key (id)=(1) is still referenced from table "Track".
But the on_delete
rule is there. Isn't the whole point of the delete rule to avoid errors like this? Or am I missing something? Initially I was trying a delete
on the queryset, and I thought the on_delete
rule wasn't supported and I had to loop through the queryset and call a delete on each instance. But apparently not even this is enough. What is the point of on_delete
if even this doesn't work? Is there anything I can do? Thanks.
UPDATE: In the shell, it works. I only get the error in the migration.
回答1:
You need to allow album
to be null indeed:
album = models.ForeignKey(Album, on_delete=models.SET_NULL, null=True)
来源:https://stackoverflow.com/questions/53765114/why-is-django-on-delete-rule-not-working