【问题标题】:unable to specify the fields in drf queryset using drf-yasg无法使用 drf-yasg 指定 drf 查询集中的字段
【发布时间】:2022-09-27 15:30:00
【问题描述】:
class ABC(generics.ListCreateApiView):
         @swagger_auto_schema(
            operation_description=\"THIS API IS TO CREATE MESSAGES IN A LIST \",
            auto_schema=AcceptFormDataSchema,
            request_body=MessageGetSerializer
         )
         def get_queryset(self):
             data =self.request.GET.get(\"code\")
             ...
    @swagger_auto_schema(
        operation_description=\"THIS API IS TO CREATE MESSAGES IN A LIST \",
        request_body=openapi.Schema(
            type=openapi.TYPE_OBJECT,
            required=[\"data\"],
            properties={
                \"code\": openapi.Schema(type=openapi.TYPE_STRING),
         def post(self, request):
             brand_code = request.data.get(\"code\")
             .....
#serializer.py

class MessageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Messages
        fields = (\"message_id\", \"content\", \"description\")

我的 post 方法适用于我需要使用相同序列化程序的字段,但它不适用于获取查询集方法。谁能建议我如何使用 drf-yasg 获取字段?

  • 你想要完成什么?仅供参考get_querysetViewSets 的内部函数,它不是端点,因此它不应该大摇大摆地出现。你不应该尝试使用内部函数作为视图处理程序,你会破坏你的ViewSet
  • 再次,你想完成什么?列出消息的端点?
  • 我正在完成所有 API 的文档,默认情况下,这个 swagger 模块 drf-yasg 正在考虑这个 get_queryset 作为一个 get API。
  • 它可能获取get 查询的原因可能是继承自ListCreateApiView,它提供了getpost 方法。此端点由 ApiView 类隐式创建,在大多数情况下您不需要覆盖它。如果你想记录它,你可以按照drf-yasg 的第一个提示并使用 Django 的method_decorator

标签: django django-rest-framework drf-yasg drf-queryset


【解决方案1】:

您不应该装饰get_queryset,因为这是一个内部函数,而不是ApiView 端点的一部分。您可能会看到一个 get 大摇大摆的请求,因为您使用的 ListCreateApiView 定义了 getpost 方法的处理程序。

由于您没有覆盖list 操作,因此您可以使用Django 的method_decorator 将装饰器注入ApiViewlist 方法,如swagger_auto_schema 装饰器的drf-yasg 部分所示。

以下是您的ApiView 的示例实现,它还应记录get 端点。

@method_decorator(
    name='get',
    decorator=swagger_auto_schema(
        operation_description="description from swagger_auto_schema via method_decorator"
    )
)
class ABC(generics.ListCreateApiView):
    serializer_class = MessageSerializer

    def get_queryset(self):
        data =self.request.GET.get("code")
        ...
    @swagger_auto_schema(
        operation_description="THIS API IS TO CREATE MESSAGES IN A LIST ",
        request_body=openapi.Schema(
            type=openapi.TYPE_OBJECT,
            required=["data"],
            properties={
                "code": openapi.Schema(type=openapi.TYPE_STRING),
            },
         )
     )
     def post(self, request):
         brand_code = request.data.get("code")
         ...

--------------
#serializer.py

class MessageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Messages
        fields = ("message_id", "content", "description")

【讨论】:

  • 我试过了,它不起作用,有没有其他可能的方法来做到这一点
猜你喜欢
  • 2019-07-27
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 2022-12-14
相关资源
最近更新 更多