0

私はオーディオファイルを取る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 )
    ...

は、何らかの検証を実行AudioFileFieldする のサブクラスです。FileField

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私にとって特に重要です。

4

1 に答える 1

0

ファイルフィールドをカスタマイズする方法を検索しましたが、問題が解決するかどうかわかりません。そうでない場合は、もう一度検索して、エラーを教えてください。

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
于 2013-03-04T18:38:13.820 に答える