#django-rest-framework
#django-rest-framework
Вопрос:
На днях я обнаружил, что пишу эту смесь представлений для Django Rest Framework:
class SerializerRetrievalMixin(object):
"""
Mixin that just passes request query params to a serializer, validates
and returns the response.
Implementing classes must have a `serializer_class` attribute.
"""
def get(self, request):
serializer = self.serializer_class(
data=request.query_params,
context={'request': request},
)
serializer.is_valid(raise_exception=True)
return Response(serializer.data, status=status.HTTP_200_OK)
Есть ли что-нибудь подобное уже в Django Rest Framework? Я обнаружил, что CreateAPIView
это довольно хорошо работает с POST, но есть ли что-нибудь подобное для GET? RetrieveAPIView
основан на том, что задействована модель Django, но в моем случае ее нет.
Ответ №1:
Если вы проверите код get
метода, вы увидите, что он вызывает get_object
извлечение объекта для сериализации. Итак, если вы не работаете с моделями, вы можете переопределить свой объект get, чтобы вернуть объект или любые данные, которые должны быть сериализованы и отправлены в качестве ответа. Конечно, вы не можете использовать сериализатор модели в этом случае, поскольку он ожидает объекты модели.
Комментарии:
1. Я знаю, я пытался просто вернуть
self.request.query_params
get_object
метод, но это не работает, когда, например, сериализатор имеет необязательное поле со значением по умолчанию, а параметры запроса не содержат этого поля. Это кажется довольно простым и распространенным вариантом использования, поэтому мне было интересно, есть ли какой-либо встроенный способ его поддержки.2. Еще одна вещь, которой не хватает в этом методе, заключается в том, что он никогда фактически не проверяет данные.
3. Честно говоря, я на самом деле не вижу работы, которую выполняет ваша конечная точка, поскольку она просто возвращает параметры запроса, которые были отправлены в запросе. В любом случае опубликуйте свой код сериализатора, поскольку проверка выполняется там. Также публикуйте ошибки, которые вы получаете
4. В микшировании, которое я опубликовал в своем вопросе, я делаю
serializer.is_valid(raise_exception=True)
, прежде чем возвращать данные сериализатора. Шаг проверки также заполняет поле, доступное только для чтения, в моем сериализаторе, которое возвращается пользователю. По соображениям секретности я не могу опубликовать фактический код сериализатора, и, честно говоря, я не думаю, что это имеет отношение к вопросу.5.
serilaizer.is_valid
просто вызывает другие методы в сериализаторе для проверки данных, и это строго зависит от определения сериализатора. Так что я не уверен, почему вы считаете, что сериализатор здесь неуместен, но в любом случае все зависит от вас. Я попытался предложить лучшее предложение, которое я мог, основываясь на опубликованной вами информации. К сожалению, я не могу помочь без дополнительной информации. Надеюсь, вы найдете способ решить вашу проблему