Просмотр набора данных для извлечения, не связанного с какой-либо моделью Django

#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 просто вызывает другие методы в сериализаторе для проверки данных, и это строго зависит от определения сериализатора. Так что я не уверен, почему вы считаете, что сериализатор здесь неуместен, но в любом случае все зависит от вас. Я попытался предложить лучшее предложение, которое я мог, основываясь на опубликованной вами информации. К сожалению, я не могу помочь без дополнительной информации. Надеюсь, вы найдете способ решить вашу проблему