如何将删除从子级级联到paren

2024-04-25 02:08:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下型号:

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将成为一个提醒。在

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

我需要知道的是:

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

另外,如果它不是一对一的关系,假设它是一个多对一(多个待办事项对一个提醒)关系,那么如何设置模型,以便如果删除了一个Todo对象,那么提醒对象也将被删除,但前提是没有更多的Todo对象链接到该提醒?在

此外,关于:

^{pr2}$

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


Tags: 对象falsetruedefaultmodeltimeismodels
1条回答
网友
1楼 · 发布于 2024-04-25 02:08:40

你在定义关系

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

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

更多参考here

^{pr2}$

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


如注释中所述,如果要在删除Reminder对象时将相应Todo对象中的reminder字段设置为NULL,那么可以将OneToOne关系字段放在Reminder类中,而不是{}类中。在

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

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

相关问题 更多 >