Джанго: Есть ли способ сериализации поля модели вместо модели? - PullRequest
1 голос
/ 14 марта 2019

есть ли способ реализовать сериализатор для поля?

У меня есть настраиваемое поле, которое является подклассом моделей. Текстовое поле выглядит так:

class UpperCaseField(models.TextField):
   pass

Я хотел бы использоватьэто в модели Person следующим образом:

class Person(models.Model):
   first_name = models.TextField()
   last_name = UpperCaseField()

Пользователи могут создавать объекты Person следующим образом:

student = Person(first_name='John', last_name='Doe')

, но я хочу сохранить его как John DOE вместо John Doe.

Для каждого сохранения объекта я хотел бы преобразовать last_name в верхний регистр перед сохранением БД.поэтому мне нужно написать сериализатор для UpperCaseField.Как я могу это сделать?Я знаю, что могу использовать сигналы предварительного сохранения или переопределить метод модели save, но все эти решения являются решениями на уровне модели.Я хочу сделать это на уровне поля, поэтому мне не нужно повторять ту же логику на любых других моделях, которые я использую UpperCaseField в качестве поля.

Спасибо за ваше время!

1 Ответ

0 голосов
/ 15 марта 2019

Вы спрашиваете о сериализаторах в контексте DRF? Если это так, я думаю, что вы хотите сделать, это предоставить способ десериализации, поэтому поле будет сохранено в верхнем регистре.

Пользовательское поле сериализатора можно определить, создав подкласс Поле , как описано здесь: https://www.django -rest-framework.org / api-guide / fields / # custom-fields . В методе to_internal_value вы можете преобразовать значение в верхний регистр. Затем в сериализаторе модели вы можете использовать это настраиваемое поле для полей модели, которые вы хотите сохранить в верхнем регистре. Чтобы это работало, вам не нужно определять поле пользовательской модели, достаточно будет поле сериализатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...