Duplicating model instances and their related objects in Django / Algorithm for recusrively duplicating an object

后端 未结 17 1043
名媛妹妹
名媛妹妹 2020-11-29 01:04

I\'ve models for Books, Chapters and Pages. They are all written by a User:

from django.db import models
         


        
17条回答
  •  我在风中等你
    2020-11-29 01:39

    Simple non generic way

    Proposed solutions didn't work for me, so I went the simple, not clever way. This is only useful for simple cases.

    For a model with the following structure

    Book
     |__ CroppedFace
     |__ Photo
          |__ AwsReco
                |__ AwsLabel
                |__ AwsFace
                      |__ AwsEmotion
    

    this works

    def duplicate_book(book: Book, new_user: MyUser):
        # AwsEmotion, AwsFace, AwsLabel, AwsReco, Photo, CroppedFace, Book
    
        old_cropped_faces = book.croppedface_set.all()
        old_photos = book.photo_set.all()
    
        book.pk = None
        book.user = new_user
        book.save()
    
        for cf in old_cropped_faces:
            cf.pk = None
            cf.book = book
            cf.save()
    
        for photo in old_photos:
            photo.pk = None
            photo.book = book
            photo.save()
    
            if hasattr(photo, 'awsreco'):
                reco = photo.awsreco
                old_aws_labels = reco.awslabel_set.all()
                old_aws_faces = reco.awsface_set.all()
                reco.pk = None
                reco.photo = photo
                reco.save()
    
                for label in old_aws_labels:
                    label.pk = None
                    label.reco = reco
                    label.save()
    
                for face in old_aws_faces:
                    old_aws_emotions = face.awsemotion_set.all()
                    face.pk = None
                    face.reco = reco
                    face.save()
    
                    for emotion in old_aws_emotions:
                        emotion.pk = None
                        emotion.aws_face = face
                        emotion.save()
        return book
    

提交回复
热议问题