Django избегая бесконечного save () l oop, с сохранением ImageField с использованием метода пользовательской модели - PullRequest
0 голосов
/ 08 февраля 2020

Я хочу, чтобы моя модель звонила save_image() каждый раз, когда пользователь создает новую модель Post. Я попытался переопределить метод save (), но он вызывает бесконечное l oop (потому что save_image() вызывает self.image.save().). Я пытался отключить сигналы, но они ничего не сделали. Я хотел добавить что-то вроде @receiver(post_save, sender=Post) для save_image и удалить переопределение save () (я даже не знаю, решит ли это проблему с бесконечным l oop). Основная проблема здесь в том, что save_post () ДОЛЖЕН вызываться после стандартного сохранения (потому что для этого нужны Post.pk, Post.video). Если у вас есть идеи, пожалуйста, помогите мне.

Вот мой код:

class Post(BaseModel):
     owner = models.ForeignKey(User, on_delete=models.CASCADE)
     # Other fields
     video = models.FileField(upload_to='post_videos/', default='defaults/video.mp4')
     image = models.ImageField(upload_to='post_images', default='defaults/post_image.png')

     def save(self, *args, **kwargs):
         super(Post, self).save(*args, **kwargs)
         self.save_image()

     @receiver(post_save, sender=Post)
     def save_image(self):
         # Setting self.image to some frame of Video
         cap = cv2.VideoCapture(self.video.path)
         video_length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) - 1
         if cap.isOpened() and video_length > 0:
             success, image = cap.read()
             if success:
                 rescaled = (255.0 / image.max() * (image - image.min())).astype(np.uint8)
                 PILimg = Image.fromarray(rescaled)
                 filename = "postimage"+str(self.pk)+".png"
                 f = BytesIO()
                 try:
                     PILimg.save(f, format='png')
                     s = f.getvalue()

                     self.image.save(filename, ContentFile(s))

                 finally:
                     f.close()

1 Ответ

0 голосов
/ 08 февраля 2020

Я нашел это! Я должен был добавить save=False к self.image.save(filename, ContentFile(s)). Если у вас была похожая проблема, вы также можете снова сохранить всю модель (снова вызвав super(Post, self).save(*args, **kwargs)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...