How to remove one-to-one related models cascading in django?

Reference Information:

I have the following models defined in Django (1.8.5):

class PubishInfo(models.Model):
    pass

class Book(models.Model):
    info = models.OneToOneField(
        PublishInfo, on_delete=models.CASCADE)

class Newspaper(models.Model):
    info = models.OneToOneField(
        PublishInfo, on_delete=models.CASCADE)

Where Book NewsPaperuses the same model PublishInfoas OneToOneField, which is actually a unique foreign key.

Now, if I delete an object PublishInfo, the related object Bookor NewsPaperwill be deleted using cascading.


Question:

But actually, I want to remove the cascading of the object PublishInfowhen deleting the Bookor object NewsPaper. This way is the way I can call.

Is there a good way to automatically cascade deletion in the opposite direction in this case?

+4
2

post_delete , Book Newspaper:

from django.db.models.signals import post_delete
from django.dispatch import receiver

@receiver(post_delete, sender=Book)
def auto_delete_publish_info_with_book(sender, instance, **kwargs):
    instance.info.delete()

@receiver(post_delete, sender=Newspaper)
def auto_delete_publish_info_with_newpaper(sender, instance, **kwargs):
    instance.info.delete()
+2

save delete:

@ozgur, , , , Model.delete(), PublishInfo:

class Book(models.Model):

    info = models.OneToOneField(
        PublishInfo, on_delete=models.CASCADE)

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        if not self.info:
            self.info = Publish.objects.create()
            super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        super().delete(*args, **kwargs)
        if self.info:
            self.info.delete()

:

, , , PublishInfo .

, ?

class PublishInfoAttachedModel(models.Model):

    info = models.OneToOneField(
        PublishInfo, related_name='$(class)s',
        on_delete=models.CASCADE)

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        if not self.info:
            self.info = Publish.objects.create()
            super().save(*args, **kwargs)

    def delete(self, *args, **kwargs):
        super().delete(*args, **kwargs)
        if self.info:
            self.info.delete()

    class Meta:
        abstract = True

abstract = True .

, PublishInfo , , :

class Book(PublishInfoAttachedModel, 
           models.Model):
    pass

class NewsPaper(PublishInfoAttachedModel, 
           CommentsAttachedModel,  # if we have other attached model info
           models.Model):
    pass

, models.Model , , Model.

0

Source: https://habr.com/ru/post/1612174/


All Articles