我有以下型号:
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)
如果在表单中留空,那么默认值是什么,存储在数据库中?
答案 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,当你输入任何一个类时,它是相同的。您将通过两个对象的属性访问它。
对于多对一,您必须使用事前删除信号。但信号有其自身的局限性