Django模型中的FileField调用Python对象时超出了最大递归深度

1 投票
1 回答
620 浏览
提问于 2025-04-18 17:55

我的模型:

class Movie(models.Model):
        title = models.CharField(max_length=200)
        description = models.CharField(max_length=1500)
        publish_date = models.DateField()
        file_1080p = models.FileField(upload_to=generate_filename_movie, validators=[validate_video])
        file_720p = models.FileField(upload_to=generate_filename_movie_720)
        file_480p = models.FileField(upload_to='temp/')
        subtitles = models.FileField(upload_to=generate_filename_subtitle_movie, validators=[validate_subtitles])
        already_converted = bool(False)

我的保存函数:

    def save(self, *args, **kwargs):
            if self.already_converted == False:
                    # todo convert files
                    self.already_converted = True
            if self.subtitles.path.endswith('.srt'): # srt subtitle should process
                    import re
                    m = re.sub(r'([0-9]{2}:[0-9]{2}:[0-9]{2}),([0-9]{3})', r'\1.\2', self.subtitles.read())
                    from django.core.files.base import ContentFile
                    filenameToSave = generate_filename_subtitle_movie(0, self.subtitles.name)
                    self.subtitles.save(filenameToSave, ContentFile("WEBVTT\n\n" + m))
            super(Movie, self).save(*args, **kwargs)

错误发生在这里:self.subtitles.save(filenameToSave, ContentFile("WEBVTT\n\n" + m))

谢谢。

1 个回答

2

在一个FileField上调用save方法时,默认会触发它所在模型的save方法。你可以通过给FileFieldsave方法提供一个额外的第三个参数来绕过这个默认行为。

self.subtitles.save(filenameToSave, ContentFile("WEBVTT\n\n" + m), False)

可以看看这个链接:

https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.fields.files.FieldFile.save

撰写回答