Это довольно стандартная задача в Django REST Framework для добавления дополнительных args
/kwargs
в сериализатор для установки значений полей, заданных не через request.data
, а через значение в параметрах url или куки. Например, мне нужно установить поле user
моей модели комментариев, равное request.user
по запросу POST. Эти дополнительные аргументы называются контекстом.Django REST Framework: как работает сериализатор?
Несколько вопросов (1, 2) на StackOverflow предположить, что я переопределить get_serializer_context()
метод моего ModelViewSet
. Я сделал, и это не помогает. Я попытался понять, что случилось, и выяснил, что я не понимаю из исходного кода, как эта контекстная система должна работать в целом. (документации по этому вопросу также не хватает)
Может ли кто-нибудь объяснить, где сериализатор добавляет контекст в обычные данные запроса? Я нашел два места, где он сохраняет значения из контекста.
- serializer.save(), метод, который смешивает kwargs с использованием проверенных данных, но это, как правило, вызывается без аргументов (например, путем ModelMixins).
- fields.
__new__()
, который кэширует аргументы и kwargs, но кажется, что никто их не читает позже.
То, что я понял, но что будет дальше? Я не вижу, где Serializer использует этот контекст, чтобы заполнить поля значениями, взятыми из него. –
В нормальных случаях контекст не будет использоваться сериализатором. Если мы хотим получить доступ к объекту 'request' в сериализаторе, мы будем использовать' self.context.get ('request') '. Кроме того, в любом методе 'to_representation' поля сериализатора мы можем получить доступ к' context', используя переменную 'self.context'. –
(Из [docs] (http://www.django-rest-framework.org/api-guide/serializers/#including-extra-context)). Одним из распространенных случаев включения контекста является то, что вы используете сериализатор, который включает в себя гиперссылки, что требует, чтобы сериализатор имел доступ к текущему запросу, чтобы он мог правильно генерировать полные URL-адреса. –