通过OneToOneField删除相关对象 [英] Delete related object via OneToOneField

查看:304
本文介绍了通过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 value CASCADE. It is also available for OneToOneField along with ForeignKey.

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 in Wheel model instead of Car. Now when you delete Car model corresponding Wheel will also be deleted.

Problem with overriding delete() method is that it will not be called if you do bulk delete operation as Car.objects.filter().delete()

这篇关于通过OneToOneField删除相关对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆