在这种情况下,有没有一些聪明的方法来执行删除呢?
class Bus(models.Model):
wheel = OneToOneField(Wheel)
class Bike(models.Model):
wheel = OneToOneField(Wheel)
pedal = OneToOneField(Pedal)
class Car(models.Model):
wheel = OneToOneField(Wheel)
class Wheel(models.Model):
somfields
car = Car()
wheel = Wheel()
wheel.save()
car.wheel = wheel
car.save()
car.delete() # I want to delete also wheel (and also all stuff pointing via OneToOneField eg pedal)
我是否需要覆盖汽车,自行车,巴士模型的删除方法,或者有更好的方法?另一种选择是在轮子上创建汽车、自行车、公交车模型,但这没有多大意义。
发布于 2013-05-18 03:24:56
事情是这样的,因为Car
链接到Wheel
,所以它是关系中的依赖模型。因此,当您删除Wheel
时,它会删除所有从属模型(包括相关的Car
行)。但是,在删除Car
时,由于Wheel
不依赖于Car
,因此不会将其删除。
为了删除Django中的父关系,您可以覆盖Car
的delete
方法:
class Car(models.Model):
# ...
def delete(self, *args, **kwargs):
self.wheel.delete()
return super(self.__class__, self).delete(*args, **kwargs)
然后,在执行以下操作时:
Car.objects.get(...).delete()
还将删除Wheel
。
发布于 2013-05-18 07:05:29
django已经通过on_delete
属性值CASCADE
提供了级联删除。它还可以与ForeignKey
一起用于OneToOneField
。
ForeignKey.on_delete
当被ForeignKey引用的对象被删除时,Django在缺省情况下会模拟删除级联上的SQL约束的行为,还会删除包含ForeignKey的对象。
但是,在您的模型中,您正在将OneToOneField
放入另一个模型中,因此您没有看到预期的行为。
将您的模型更改为:
class Car(models.Model):
somefields
class Wheel(models.Model):
somfields
car = OneToOneField(Car)
也就是说,将OneToOneField
而不是Car
放入Wheel
模型中。现在,当您删除Car
模型时,相应的Wheel
也将被删除。
覆盖delete()
方法的问题是,如果您以Car.objects.filter().delete()
身份执行批量删除操作,则不会调用该方法
https://stackoverflow.com/questions/16620324
复制