【问题标题】:How do properly use queryset in a GenericAPIView in Django DRF?如何在 Django DRF 的 GenericAPIView 中正确使用查询集?
【发布时间】:2021-11-07 19:11:40
【问题描述】:

我已经开始使用 GenericAPIView 而不是 APIView,我对在类顶部定义的 queryset 和 serializer_class 的使用感到困惑。 我知道必须定义这些,但我现在在班级顶部有一个查询,在 GET 中有另一个查询。我的问题是我可以在我的 GET 方法中使用查询集,这样我就不会进行 2 次不必要的查询。

class demo(GenericAPIView):
    queryset = Demo.objects.all()
    serializer_class = DemoSerializer
    def get(self, request, num, format=None):
        query = Demo.objects.filter(name=test, number=num)

换句话说,queryset = Demo.objects.all() 被定义是因为它是必需的——但我并没有真正使用它,所以看起来像是一个额外的查询......

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    queryset 仅在您未定义 get_queryset 方法的情况下才需要。在您的情况下,不要在get 中定义额外的查询集,只需实现get_queryset。如果您使用的是 url 的 kwargs,您可以在此方法中使用 self.kwargs 属性获取它:

    class demo(GenericAPIView):
        serializer_class = DemoSerializer
    
        def get_queryset(self):
            return Demo.objects.filter(name=test, number=self.kwargs['num'])
    

    【讨论】:

    • 我刚刚发布了我的 get 方法的精简版本 - 里面有更多的逻辑。如果只是将所有这些功能移动到 get_queryset 并完全删除 get 方法,我现在很困惑 - 或者在两者之间拆分。
    • @david 最好在两种方法之间拆分逻辑。与查询集相关的部分可以移至get_queryset。而在get() 中,只需使用self.get_queryset()
    • 我可以在 get_queryset 中定义一个基本查询集,然后在 get 方法中调用 queryset = self.get_queryset() ,然后在那里应用更多过滤器吗?
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2021-10-04
    相关资源
    最近更新 更多