代码之家  ›  专栏  ›  技术社区  ›  Riccardo Bucco

用Django实现REST API

  •  0
  • Riccardo Bucco  · 技术社区  · 4 年前

    这是我的Django模型:

    class M(models.Model):
        a = models.IntegerField()
        b = models.IntegerField()
    

    这是序列化程序:

    class MSerializer(ModelSerializer):
        class Meta:
            model = M
            fields = ['a', 'b']
    

    我希望能够实现以下REST API:

    • 127.0.0.1:8000/m/ (获取所有元素的列表,发布新元素)
    • 127.0.0.1:8000/m/:id/ (获取id为的元素的详细信息) id )
    • 127.0.0.1:8000/n/:a/m/ (获取具有特定属性的所有元素) a (现场)

    到目前为止,这是我实现的视图和URL:

    class MViewSet(ModelViewSet):
        queryset = M.objects.all()
        serializer_class = MSerializer
    
    router = DefaultRouter()
    router.register(r'm', MViewSet)
    
    urlpatterns = [
        path('', include(router.urls)),
    ]
    

    然而,以这种方式,第三个用例不起作用。如何修改代码以使第三个案例生效?我希望使用尽可能少的代码行(也就是说,我希望使用一些Django内置的功能)。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Dan Yishai    4 年前

    因为看起来你希望第三个端点位于另一个根目录上(可能是另一个应用程序名) n ),我将实现它是一个独立的API视图,而不是作为视图集上的操作(尽管这两个选项都是可能的)

    class FilteredMListView(ListAPIView):
        serializer_class = MSerializer
    
        def get_queryset(self):
            return M.objects.filter(a=self.kwargs["a"])
    

    然后使用以下命令将其注册到路由器:

    urlpatterns = [
        path("n/<str:a>/m/", FilteredMListView.as_view())
    ]
    
        2
  •  0
  •   gmc    4 年前

    对于第三种情况,我会使用 ListAPIView ,凌驾于 get_queryset 方法按传递的值进行筛选 a .我们的想法是 得到你的质疑 方法被调用,并与您想要实现的其他过滤器一起调用 A. 他总是在场。因为 A. 将出现在url中,这是必需的,并且在视图的kwargs中始终有。看起来是这样的:

    网址。py

    router = DefaultRouter()
    router.register(r'm', MViewSet)
    
    urlpatterns = [
        path('', include(router.urls)),
        path('<a>/m', AValuesListApiView.as_view()
    ]
    

    意见。py

    class AValuesListApiView(generics.ListAPIView):
        queryset = M.objects.all()
        serializer_class = MSerializer
    
    def get_queryset(self):
        return super().get_queryset().filter(score=self.kwargs["score"])