Как изменить peewee настраиваемые поля после метода save ()? - PullRequest
0 голосов
/ 22 декабря 2019

Например, у меня есть модель:

class ExampleModel(Base):
    name = CharField(max_length=255)
    image = ImageField(size=(200, 200))

    class Meta:
        table_name = 'example'

ImageField - это мое настраиваемое поле:

class ImageField(TextField):
    thumb_size: Tuple[int, int] = None

    def __init__(self, size: Tuple[int, int] = None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.thumb_size = size

    def db_value(self, value):
        # ...some file upload logic

        return json.dumps({
            'original': original_path,
            'thumbnail': thumbnail_path
        })

    def python_value(self, value):
        return json.loads(value)

Когда я сохраняю экземпляр, все хорошо (body.image имееттип starlette.datastructures.UploadFile):

example: ExampleModel = dict_to_model(ExampleModel, body)
example.save()

Но, если я проверю тип example.image после сохранения, он все равно будет иметь тип starlette.datastructures.UploadFile. Как я могу изменить поле изображения после сохранения, или может быть после запуска db_value() метод?

1 Ответ

0 голосов
/ 23 декабря 2019

python_value() и db_value() используются при чтении и записи в базу данных соответственно. Они не являются местом для выполнения каких-либо магических операций, кроме преобразования значения из одного типа данных в другой, и предназначены исключительно для предоставления Pythonic-типов данных для значений, поступающих из курсора базы данных.

* 1006Другими словами, вы помещаете свою магию не в то место. Поместите его в метод save(), а не в класс поля.
...