Логика в модели django, как исправить?

Есть такие модели:
class Post(models.Model):
    class Meta:
        verbose_name = 'Статья'
        verbose_name_plural = 'Список статей'
        ordering = ['-timestamp']


    title = models.CharField(max_length=120, verbose_name='Заголовок')
    body = models.TextField(verbose_name='Текст')
    anounce = models.TextField(verbose_name='Анонс')
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True, verbose_name='Дата создания')
    author = models.ForeignKey(User, verbose_name='Автор', related_name='posts')
    approve = models.BooleanField(default=False)
    preview = models.ImageField(upload_to="preview/%Y/%m/%d", blank=True)
    likers = models.ManyToManyField(User, verbose_name='Добавившие в избранное', related_name='favorites', blank=True, default=None)
    category = models.ForeignKey(Category, verbose_name='Категория', related_name='posts', null=True)
    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        super(Post, self).save(*args, **kwargs)
        if self.photos.all().count() > 0:
            self.preview = self.photos.all().first().image
            resize_thumbnail(self.preview)
        super(Post, self).save(*args, **kwargs)





class Photo(models.Model):
    post = models.ForeignKey(Post, related_name='photos')
    image = models.ImageField(upload_to="%Y/%m/%d")
        
    def save(self, *args, **kwargs):
        super(Photo, self).save(*args, **kwargs)
        if self.image:
            resize_image(self.image)

Логика в методах save должна быть такая: После соранения всех изображений в модели Photo, обновляется поле preview модели пост, кропается и сохраняется в бд. Но проблема в том, что preview обновляется на второе сохранение, тоесть, сохраняю модель первый раз, ничего не происходит(с полем preview), сохраняю модель Post второй раз, и поле обновляется.
Ещё пробовал делать через сигнал, вот так:
@receiver(signals.post_save, sender=Post, dispatch_uid="set_preview")
def set_preview(sender, instance, **kwargs):
    if instance.photos.all().count() > 0:
            instance.preview = instance.photos.all().first().image
            resize_thumbnail(instance.preview)
            instance.preview.save()

Но получаю ошибку:
save() missing 2 required positional arguments: 'name' and 'content'

Буду благодарен, если поможете исправить логику.
  • Вопрос задан
  • 283 просмотра
Пригласить эксперта
Ответы на вопрос 1
@deliro
Вот это что за колхоз?
->   super(Post, self).save(*args, **kwargs)
        if self.photos.all().count() > 0:
            self.preview = self.photos.all().first().image
            resize_thumbnail(self.preview)
    ->  super(Post, self).save(*args, **kwargs)

Это:
if self.photos.all().count() > 0:
Заменить на
if self.photos.exists():

Этот код что делает?
resize_thumbnail(self.preview)

P.S.
Тамбнейлы можно (и даже лучше) генерировать этим:
django-imagekit
easy-thumbnails
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы