【问题标题】:do we need query set in CreateAPIView?我们需要在 CreateAPIView 中设置查询吗?
【发布时间】:2021-12-28 07:38:51
【问题描述】:

我的问题很直接。我实际上不确定 CreateAPIView 是否需要查询集..?

class CreateNotificationAPIView(generics.CreateAPIView):
    """This endpoint allows for creation of a notification"""
    queryset = Notification.objects.all() #can we remove it, if we do so, will we face any issue in future ?
    serializer_class = serializers.NotificationSerializer

【问题讨论】:

    标签: python django database


    【解决方案1】:

    CreateAPIView [drf-doc] 提供的唯一 HTTP 方法是 POST 方法,它通过调用 create 方法来实现这一点。 .create(…) method is implemented as [GitHub]

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
    

    这些方法仅适用于序列化程序,或者默认情况下仅适用于序列化程序的数据的self.perform_createself.get_success_headers

    如果您因此不重写 CreateAPIView 的方法以以某种方式使用查询集,您可以定义 CreateAPIView 而不定义 queryset 或重写 get_queryset

    【讨论】:

      【解决方案2】:

      根据REST_docs

      queryset - 应该用于从以下位置返回对象的查询集 这种观点。通常,您必须设置此属性,或覆盖 get_queryset() 方法。如果您要覆盖视图方法,则它是 重要的是您调用 get_queryset() 而不是访问它 属性直接,因为查询集将被评估一次,而那些 结果将为所有后续请求缓存。

      【讨论】:

        猜你喜欢
        • 2011-01-20
        • 1970-01-01
        • 2021-04-13
        • 2021-09-29
        • 2020-11-16
        • 1970-01-01
        • 2018-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多