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'不是可用的数据库后端