Как создать пользовательский FileField, который изменяет загруженный файл в Django - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу изменить содержимое файлов при их загрузке. У меня есть много моделей, использующих несколько FileFields, которым нужно такое поведение, поэтому я не хочу использовать сигналы или переопределять модель save() в каждой модели. Я хочу создать пользовательский FileField для обработки этого поведения.

Я пытаюсь сделать это, расширяя FileField и переопределяя метод pre_save(). Я могу прочитать содержимое файла, но когда я пишу в файл, он остается неизменным. Ниже приведен базовый пример c.

fields.py

from django.db.models import FileField

class CustomFileField(FileField):
    def pre_save(self, model_instance, add):
        file = super().pre_save(model_instance, add)
        file.write(b'foo')
        return file

models.py

from django.db import models
from fields import CustomFileField

class MyModel(models.Model):
    my_field = CustomFileField(upload_to='files')

1 Ответ

0 голосов
/ 17 апреля 2020

Вместо создания пользовательского FileField я выбрал следующий подход: создание пользовательского поля без логарифмов c и абстрактной модели, в которой файл изменяется в методе save(). Я все еще чувствую, что этот лог c должен принадлежать пользовательскому полю, и это хакерство. Но это работает.

fields.py

from django.db.models import FileField

class CustomFileField(FileField):
    pass

models.py

from django.db import models
from fields import CustomFileField

class CustomFileFieldModel(models.Model):
    class Meta:
        abstract = True

    def save(self, force_insert=False, force_update=False, using=None,
         update_fields=None):
    super().save(force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)

    fields = self._meta.get_fields()

    for field in fields:
        if field.__class__ == CustomFileField:

            file = getattr(self, field.name)

            with file.open(mode='w') as f:
                f.write('foo')

class MyModel(CustomFileFieldModel):
    my_field = CustomFileField(upload_to='files')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...