(Как) Могу ли я объявить, как тип поля должен быть де-сериализован средой REST Django? - PullRequest
0 голосов
/ 20 ноября 2018

Я использую пользовательский тип поля в проекте Django, основанный на django.db.models.IntegerField, и этот тип используется для различных полей в модели.Он используется для хранения данных в виде целого числа в базе данных, в то время как он имеет более сложный связанный тип Python и строковое представление.Он также реализует методы value_to_string и to_python, которые соблюдаются при использовании, например, ./manage.py dumpdata.

Я также представил REST API с DRF, где очень универсальный сериализатор на основе rest_framework.serializers.HyperlinkedModelSerializer с fields сконфигурированный как __all__ в его Meta объекте используется.

При доступе к этому API TypeError добавляется в rest_framework.fields.IntegerField.to_representation, когда он пытается манипулировать вышеупомянутым типом Python через int.

Теперь, учитывая, что для данного типа реализованы подпрограммы десериализации / сериализации, легко реализовать тип поля (в смысле DRF, как замена ранее упомянутого класса).Но как мне настроить отображение между этим полем type и единицами Django ORM только один раз без объявления типа поля (DRF) для каждого затронутого поля?Я не могу найти намека на это ни в полях сериализатора , ни в документах , ни в модуле rest_framework.fields.

1 Ответ

0 голосов
/ 22 ноября 2018

Вам необходимо создать настраиваемое поле сериализатора, соответствующее полю вашей модели, а затем добавить его в отображение, которое DRF использует для ModelSerializer.

Вот так DRF добавляет django.contrib.postgres.fields.* сопоставления.

Примерно так:

class MyField(models.IntegerField):
    pass

class MyDrfField(Field):
    def to_internal_value(...)
    def to_representation(...)

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