【问题标题】:Subclass FileField in Django REST FrameworkDjango REST 框架中的子类 FileField
【发布时间】:2013-02-18 21:56:10
【问题描述】:

我有一个带有音频文件的 django 模型:

class Thing(models.Model):

    audio_file = AudioFileField(    upload_to=audio_dir, blank=True, null=True )
    photo_file = models.ImageField( upload_to=img_dir,   blank=True, null=True )
    ...

其中AudioFileFieldFileField 的子类,执行一些验证:

class AudioFileField(models.FileField):
    def validate(self, value, model_instance):
        try:
            if not (value.file.content_type == "audio/x-wav" or 
                    value.file.content_type == "audio/amr" or 
                    value.file.content_type == "video/3gpp"):
                raise ValidationError(u'%s is not an audio file' % value)
        except IOError:
            logger.warning("no audio file given")

audio_dir 回调设置路径并重命名文件:

def audio_dir(instance, filename):
        return os.path.join("audio", "recording_%s%s" % (
            datetime.datetime.now().isoformat().replace(":", "-"), 
            os.path.splitext(filename)[1].lower() ))

在 Django REST 框架中,ImageField 工作正常,但子类 AudioFileField 不能。这是因为子类serializers.FileField 不接受关键字参数upload_to

如何通过 API 公开相同的功能? audio_dir 回调对我来说特别重要。

【问题讨论】:

    标签: django api django-rest-framework


    【解决方案1】:

    我搜索了如何自定义文件字段,但我不知道它是否可以解决您的问题。如果没有,我会再次搜索并告诉我错误。

    class Thing(models.Model):
        audio_file = AudioFileField(
            upload_to=audio_dir, 
            blank=True, null=True,
            content_types=['audio/x-wav', 'audio/amr', 'video/3gpp'] 
        )
    
        ...............
    
    class AudioFileField(models.FileField):
        def __init__(self, *args, **kwargs):
            self.content_types = kwargs.pop("content_types")
    
            super(AudioFileField, self).__init__(*args, **kwargs)
    
        def clean(self, *args, **kwargs):        
            data = super(AudioFileField, self).clean(*args, **kwargs)
    
            audio_file = data.audio_file
            try:
                content_type = audio_file.content_type
                if content_type in self.content_types:
                    raise ValidationError(u'{0} is not an audio file'.format(content_type))
                else:
                    raise forms.ValidationError(_('Audio file type not supported.'))
            except AttributeError:
                pass        
    
            return data
    

    【讨论】:

    • 谢谢,但我需要一个serializers.FileField 的子类,它可以采用upload_to 参数或类似的参数。我编辑了问题以使其(希望)更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2022-06-25
    • 2016-08-10
    • 1970-01-01
    相关资源
    最近更新 更多