通过OneToOneField删除相关对象 [英] Delete related object via OneToOneField
问题描述
在这种情况下,有没有一些聪明的方法来执行删除?
class Bus(models.Model):
wheel = OneToOneField(Wheel)
class Bike(models.Model):
wheel = OneToOneField(Wheel)
pedal = OneToOneField(踏板)
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()我想删除轮子(以及所有通过OneToOneField指向的东西,例如踏板)
我需要覆盖汽车,自行车,巴士车型的删除方法还是有更好的方法?其他选择是在车轮模型上创建汽车,自行车,公共汽车的领域,但并不重要。
级联删除已由django提供,通过 on_delete
属性值 CASCADE
。它也可用于 OneToOneField
以及 ForeignKey
。
ForeignKey.on_delete
当ForeignKey引用的对象是
删除,Django默认模拟SQL约束
ON DELETE CASCADE的行为,并删除包含
ForeignKey的对象。但是,在您的模型中,您将另一个模型中的OneToOneField
放在另一个模型中,因此您没有看到预期的行为。
将您的模型更改为:
class Car(models.Model):
somefields
class Wheel(models.Model):
somfields
car = OneToOneField(Car)
在
中放入
模型,而不是OneToOneField
Car
。现在,当您删除Car
时,相应的轮
也将被删除。
覆盖
delete()
方法的问题是,如果您以Car.objects.filter( ).delete()
Is there some clever way how to perform delete in this situation?
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)
Do I need to override delete methods of Car, Bike, Bus models or is there some better way? Other option is to create fields car, bike, bus on Wheel model, but it doesn't make much sense.
解决方案Cascading delete is already provided by django, through
on_delete
attribute valueCASCADE
. It is also available forOneToOneField
along withForeignKey
.ForeignKey.on_delete
When an object referenced by a ForeignKey is deleted, Django by default emulates the behavior of the SQL constraint ON DELETE CASCADE and also deletes the object containing the ForeignKey.
However, in your models you are putting
OneToOneField
in another model, hence you are not seeing the expected behavior.Change your models to:
class Car(models.Model): somefields class Wheel(models.Model): somfields car = OneToOneField(Car)
That is put
OneToOneField
inWheel
model instead ofCar
. Now when you deleteCar
model correspondingWheel
will also be deleted.Problem with overriding
delete()
method is that it will not be called if you do bulk delete operation asCar.objects.filter().delete()
这篇关于通过OneToOneField删除相关对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!