Django级联删除不';t删除被引用模型实例的主键

Django级联删除不';t删除被引用模型实例的主键,django,django-models,django-1.9,Django,Django Models,Django 1.9,在Django 1.9中,我在models.py中定义了相关对象,如下所示: from django.db import models class Course(models.Model): title = models.CharField(max_length=10) class Note(models.Model): course = models.ForeignKey(Course) 当我删除课程时,我希望通过默认级联行为删除所有相关的注释s。我得到的是以下行为: &

在Django 1.9中,我在models.py中定义了相关对象,如下所示:

from django.db import models

class Course(models.Model):
    title = models.CharField(max_length=10)

class Note(models.Model):
    course = models.ForeignKey(Course)
当我删除
课程
时,我希望通过默认级联行为删除所有相关的
注释
s。我得到的是以下行为:

>>> from test1.models import Course, Note

#First, create a Course and associated Note
>>> c1 = Course()
>>> c1.save()
>>> n1 = Note(course=c1)
>>> n1.save()
>>> c1.pk
4
>>> n1.pk
4

#Next, delete the Course, and see if Note deletes too
>>> c1.delete()
(2, {'test1.Course': 1, 'test1.Note': 1})
>>> c1.pk
>>> n1.pk
1    #pk remains
>>> Note.objects.get(pk=4)
Traceback (most recent call last):
...    test1.models.DoesNotExist: Note matching query does not exist.

#Finally, try deleting the Note manually
>>> n1.delete()
(0, {'test1.Note': 0})
>>> n1.pk
>>> #finally the pk is gone!
数据库似乎已正确更新,但只有课程对象在本地更新,而Note对象未更新(即保持其主键)

为什么会这样,我怎样才能让Note也删除pk,使其与db同步


额外信息:我之所以需要这种行为,是因为我在其他地方使用了类似
if note.pk:
的语句来检查给定的
note
是否已保存在数据库中。不幸的是,这种级联删除方式使这些语句变得无用,因为即使删除了db条目,pk也存在。

这是预期的行为。一旦Django从数据库中获取了某些内容(
n1在本例中为
n1),它就不会知道对它的更改,除非您再次获取它(使用
Note.objects.get(pk=4)
n1.refresh\u from_db()

调用
c1.delete()
时,Django会从数据库中删除该行,并清除对象上的
pk
。它还会删除数据库中设置为级联的所有相关对象。但是,它无法知道其他已实例化的对象正在引用该对象-它怎么可能

下面是相同行为的一个简单示例,没有外键:

# Fetch a Course
>>> c1 = Course.objects.get(pk=1)
# Fetch the same course again, but save it to a different variable
>>> c2 = Course.objects.get(pk=1)
请注意,现在数据库中有两个同一行的实例。现在:

# Delete c1
>>> c1.delete()

# c2 Hasn't changed... how could it? That would be magical.
>>> c2.pk
1

# but if you refresh c2 from the database... it isn't there
>>> c2.refresh_from_db()
DoesNotExist: Course matching query does not exist.

请您发布一个。当前
注意
有一个外键指向某个不存在的模型
a
。此外,在示例代码中,您没有实际保存创建的对象,因此后续代码(要删除)将失败。@solarissmoke已修复!我最初试图摆脱实际项目中的一些复杂性,但我搞砸了。修订后的代码已按原样进行测试,其行为如所示。是否尝试使用\u delete属性@ZG101@EliasMP默认值是_delete=models.CASCADE上的
,这是我想要的,所以我没有更改它。它是deleting数据库中的相关注释如预期的那样,但没有将pk更新为“无”。谢谢,这是一个很好的示例!我之前通过
if c2.pk:
检查保存的对象,但失败了。我想我必须捕获
DoesNotExist
错误并像这样处理它