首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通过OneToOneField删除相关对象

通过OneToOneField删除相关对象
EN

Stack Overflow用户
提问于 2013-05-18 11:14:34
回答 2查看 6.8K关注 0票数 9

在这种情况下,有没有一些聪明的方法来执行删除呢?

代码语言:javascript
代码运行次数:0
运行
复制
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)

我是否需要覆盖汽车,自行车,巴士模型的删除方法,或者有更好的方法?另一种选择是在轮子上创建汽车、自行车、公交车模型,但这没有多大意义。

EN

回答 2

Stack Overflow用户

发布于 2013-05-18 11:24:56

事情是这样的,因为Car链接到Wheel,所以它是关系中的依赖模型。因此,当您删除Wheel时,它会删除所有从属模型(包括相关的Car行)。但是,在删除Car时,由于Wheel不依赖于Car,因此不会将其删除。

为了删除Django中的父关系,您可以覆盖Cardelete方法:

代码语言:javascript
代码运行次数:0
运行
复制
class Car(models.Model):
    # ...

    def delete(self, *args, **kwargs):
        self.wheel.delete()
        return super(self.__class__, self).delete(*args, **kwargs)

然后,在执行以下操作时:

代码语言:javascript
代码运行次数:0
运行
复制
Car.objects.get(...).delete()

还将删除Wheel

票数 12
EN

Stack Overflow用户

发布于 2013-05-18 15:05:29

django已经通过on_delete属性值CASCADE提供了级联删除。它还可以与ForeignKey一起用于OneToOneField

ForeignKey.on_delete

当被ForeignKey引用的对象被删除时,Django在缺省情况下会模拟删除级联上的SQL约束的行为,还会删除包含ForeignKey的对象。

但是,在您的模型中,您正在将OneToOneField放入另一个模型中,因此您没有看到预期的行为。

将您的模型更改为:

代码语言:javascript
代码运行次数:0
运行
复制
class Car(models.Model):  
    somefields

class Wheel(models.Model):  
    somfields
    car = OneToOneField(Car)  

也就是说,将OneToOneField而不是Car放入Wheel模型中。现在,当您删除Car模型时,相应的Wheel也将被删除。

覆盖delete()方法的问题是,如果您以Car.objects.filter().delete()身份执行批量删除操作,则不会调用该方法

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16620324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档