Использование функции validate filename во всех стерилизаторах Django

У меня есть функция validate_filename в сериализаторе, но похоже, что я должен использовать одну и ту же функцию в нескольких классах сериализатора для проверки имени файла. Это не очень хорошо, потому что кажется избыточным, и концепция DRY не реализуется.

Например:

class ExampleOne(serializers.ModelSerializer):
    
    class Meta:
        model = ExampleOne
        fields =['']

    def create(self, validated_data):  ...   
        return item
    
    def validate_extension(filename):
        extension = os.path.splitext(filename)[1].replace(".", "")
        if extension.lower() not in ALLOWED_IMAGE_EXTENSIONS:
            raise serializers.ValidationError(
            (f'Invalid uploaded file type: {filename}'),
            code='invalid',

Теперь мне нужно использовать ту же функцию в других классах сериализаторов внутри того же файла сериализатора, и я не хочу повторять тот же код снова. Есть ли способ использовать отдельный файл типа validatefile.py и импортировать функцию только внутри класса сериализатора? Но я не знаю, как начать и продолжить.

Вы можете иметь отдельный класс, в котором вы можете иметь функцию, которую вы не хотите повторять. Затем вы можете наследовать этот класс вместе с классом ModelSerializer везде, где вам нужна функция, чтобы не повторяться.

Вы можете сделать следующее:

class CustomModelSerializer(serializers.ModelSerializer):
    def validate_filename(self, filename):
        # validate filename here.. 
        return filename

class ExampleOne(CustomModelSerializer):
    
    class Meta:
        model = ExampleOne
        fields =['']

    def create(self, validated_data):  ...   
        return item
    
    def validate_extension(filename):
        extension = os.path.splitext(filename)[1].replace(".", "")
        if extension.lower() not in ALLOWED_IMAGE_EXTENSIONS:
            raise serializers.ValidationError(
            (f'Invalid uploaded file type: {filename}'),
            code='invalid',
Вернуться на верх