Вы можете установить параметры on_delete
на CASCADE
:
class ClothesWashing(models.Model):
# special fields for clothes_washing
service = models.OneToOneField(Service, <b>on_delete=models.CASCADE</b>, null=True)
class RoomCleaning(models.Model):
# special fields for room_cleaning
service = models.OneToOneField(Service, <b>on_delete=models.CASCADE</b>, null=True)
on_delete=…
параметр [Django -doc] указывает, что должно произойти, когда элемент, на который он ссылается, удаляется. Поэтому, если Service
удален, и существует модель ClothesWashing
, которая ссылается на него, то вы можете указать, что делать.
Используя CASCADE
[ Django -doc] , вы также удалите связанный объект ClothesWashing
или как указано в документации:
Каскадное удаление. Django эмулирует поведение ограничения SQL ON DELETE CASCADE
, а также удаляет объект, содержащий ForeignKey
.
Лучше реализовать его с помощью этих триггеров, поскольку такие методы, как .delete()
are not всегда вызывается ORM при массовом удалении. Таким образом, Service.objects.all().delete()
удалит все службы, но никогда не вызовет .delete()
метод вашего Service
. Определяя триггеры, вы указываете Django, что должно происходить с элементами, относящимися к нему.
В этом конкретном c случае, возможно, вы захотите работать с наследованием модели [Django -doc] . Django может реализовывать некоторые шаблоны logi c (например, OneToOneField
s для родительской модели и т. Д. c.).
EDIT : если вы хотите удалить обслуживание, если дано ClothesWashing
, RoomCleaning
, et c. удалены, вы можете переопределить метод .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<b>.service.delete()</b>
class Meta:
<b>abstract = True</b>
class ClothesWashing(<b>ServiceBase</b>):
# …
pass
class RoomCleaning(<b>ServiceBase</b>):
# …
pass
Но, вероятно, если вы используете ORM, в конечном итоге некоторые объекты не будут удален из-за указанных способов обойти это.