【问题标题】:Implement REST API with Django使用 Django 实现 REST API
【发布时间】:2021-12-30 19:57:18
【问题描述】:

这是我的 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 字段的所有元素)

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

class MViewSet(ModelViewSet):
    queryset = M.objects.all()
    serializer_class = MSerializer
router = DefaultRouter()
router.register(r'm', MViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

但是,以这种方式,第三个用例不起作用。如何修改我的代码以使第三种情况有效?我希望使用尽可能少的代码行(即,我想使用一些 Django 内置功能)。

【问题讨论】:

  • 没有真正得到你的第三种情况。从哪个模型获取所有元素? n 还是 m?那里有什么?

标签: python python-3.x django django-rest-framework django-views


【解决方案1】:

由于您希望第三个端点位于另一个根目录(可能是另一个应用程序名称 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】:

    对于您的第三种情况,我将使用ListAPIView,覆盖get_queryset 方法以通过a 的值进行过滤。这个想法是,当调用get_queryset 方法时,以及您想要实现的许多其他过滤器,a 的条件始终存在。由于 a 的值将在 url 中,因此它是强制性的,并且您始终在视图的 kwargs 中。看起来像这样:

    urls.py

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

    views.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"])
    

    【讨论】:

      猜你喜欢
      • 2021-01-03
      • 2014-06-10
      • 2020-12-06
      • 2018-05-02
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多