Django Python 3.x - 用ContentTypes覆盖OneToOneField的delete()。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django Python 3.x - 用ContentTypes覆盖OneToOneField的delete()。相关的知识,希望对你有一定的参考价值。

场景:有不同的服务类型,如洗衣服,房间清洁和房间维护,这些服务都有共同的字段,如服务日期。

在场景中,我有每个服务的模型和一个 Service 模型与共同领域之间的关系。Service 模式,每个服务模式都是 OneToOneField.

我试图覆盖 delete() 作用于 Service 以下模型 回答 对我来说,它的工作原理是,但只有一个服务(如轮子在我看来是一个很好的服务)。self.wheel.delete()但如果我想在服务类型时删除,如何实现这种方法?

我的 模型.py:

class ClothesWashing(models.Model):
    # special fields for clothes_washing
    service = models.OneToOneField(Service, on_delete=models.DO_NOTHING, null=True)

class RoomCleaning(models.Model):
    # special fields for room_cleaning 
    service = models.OneToOneField(Service, on_delete=models.DO_NOTHING, null=True)

class Service(models.Model):
    # common fields for all services

    def delete(self, *args, **kwargs):
        #here I wanna "roomcleaning" attribute to be dynamic upon content type
        self.roomcleaning.delete()
        return super(self.__class__, self).delete(*args, **kwargs)

答案

你可以设置 on_delete 的参数,以 CASCADE:

class ClothesWashing(models.Model):
    # special fields for clothes_washing
    service = models.OneToOneField(Service, on_delete=models.CASCADE, null=True)

class RoomCleaning(models.Model):
    # special fields for room_cleaning 
    service = models.OneToOneField(Service, on_delete=models.CASCADE, null=True)

负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: 负责人: on_delete=… 参数[Django-doc] 指定了当它所指向的项目被删除时应该发生的事情。因此,如果 Service 移除,并有一个 ClothesWashing 模型,那么你就可以指定该怎么做。

通过使用 CASCADE [Django-doc],您将删除相关的 ClothesWashing 对象,或者按照文档中的规定。

级联删除。Django模拟了SQL约束的行为。ON DELETE CASCADE 并且还删除了包含 ForeignKey.

最好用这个触发器来实现它,因为像 .delete() 当批量删除时,总是被ORM调用。所以 Service.objects.all().delete() 将删除所有服务,但将 从来没有 称呼 .delete() 你的 Service. 通过定义触发器,你可以向Django指定与它相关的项目应该发生什么。

在这个特定的情况下,你可能会想使用 模型继承 [Django-doc]. Django可以自己实现一些锅炉模板逻辑(如 OneToOneField的父模型等)。)

编辑: 如果您想删除服务,如果给定的 ClothesWashing, RoomCleaning等被删除,您可以覆盖 .delete() 方法来删除那个也可以,比如你可以用做一个抽象的基类。

class ServiceBase(models.Model):
    # special fields for clothes_washing
    service = models.OneToOneField(Service, on_delete=models.CASCADE, null=True)

    def delete(self, *args, **kwargs):
        service = self.service
        super().delete(*args, **kwargs)
        self.service.delete()

    class Meta:
        abstract = True

class ClothesWashing(ServiceBase):
    # …
    pass

class RoomCleaning(ServiceBase):
    # …
    pass

但是很可能如果你使用ORM最终有些对象不会被删除,因为说的方法可以规避这个问题。

以上是关于Django Python 3.x - 用ContentTypes覆盖OneToOneField的delete()。的主要内容,如果未能解决你的问题,请参考以下文章

python可视化方案pyecharts + Django 框架

Django 3.x错误:'mysql.connector.django'不是可用的数据库后端

Django1.9 Python3.4出现Error loading MySQLdb

Django 安装配置

django复习--如何建立一个django项目

python find()找多个相同子字符串