如何级联从子项删除到父项

时间:2014-08-17 20:29:59

标签: python database django django-models

我有以下型号:

class Todo(models.Model):
    user = models.OneToOneField(User)
    note = models.CharField(max_length=255)
    is_important = models.BooleanField(default=False)
    is_complete = models.BooleanField(default=False)
    reminder = models.OneToOneField(Reminder, blank=True, null=True, on_delete=models.SET_NULL)


class Reminder(models.Model):
    start_time = models.DateTimeField()
    stop_time = models.DateTimeField(blank=True)

基本上,当提供开始和可选的结束时间时,Todo会成为提醒。

目前,当我删除一个Reminder对象时,Todo对象中的提醒字段被设置为Null,这就是我想要的。

我需要知道的是:

如何设置这些模型,以便在删除Todo对象时,相应的Reminder对象也会被删除?

另外,如果它不是一对一的关系,让我们说它是多对一(许多Todo到一个Reminder)的关系,怎么可以设置模型,这样如果一个Todo对象是删除后,Reminder对象也将被删除,但仅当没有更多Todo对象链接到提醒时?

另外,关于:

stop_time = models.DateTimeField(blank=True)

如果在表单中留空,那么默认值是什么,存储在数据库中?

1 个答案:

答案 0 :(得分:2)

您将关系定义为

    reminder = models.OneToOneField(Reminder, blank=True, null=True,
                 on_delete=models.SET_NULL)

您在此处指定on_delete=models.SET_NULL。这告诉django在删除引用的对象时将字段设置为NULL。如果要删除对象,请使用models.CASCADE。 Django使用它作为默认值。

更多参考here

stop_time = models.DateTimeField(blank=True)

如果未指定任何内容,则此字段将不会设置且为空白,则此字段没有默认值。


如评论中所述,如果要在删除Todo对象时将对应的NULL对象中的提醒字段设置为Reminder,则可以将{{1 OneToOne类中的关系字段而不是Reminder类。

作为它的关系,根据django ORM,当你输入任何一个类时,它是相同的。您将通过两个对象的属性访问它。

对于多对一,您必须使用事前删除信号。但信号有其自身的局限性