DRF如何知道一个简单的POST请求应该调用create()?

时间:2016-11-05 13:57:25

标签: django django-rest-framework

我认为最好用代码示例来解释。

Angular会发出如下的POST请求:

$http.post('/api/accounts/', {
            username: username,
            password: password,
            email: email
}

这是由Django在urls.py中获取的:

router = routers.SimpleRouter()
router.register(r'accounts', AccountViewSet)
urlpatterns = [
    url(r'^api/', include(router.urls)),
]

这是AccountViewSet:

class AccountViewSet(viewsets.ModelViewSet):
    serializer_class = AccountSerializer
    queryset = Account.objects.all()
    lookup_field = 'username'

    def create(self, request):
        serializer = self.serializer_class(data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(
                serializer.validated_data,
                status=status.HTTP_201_CREATED
            )

这是串行器:

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account

    def create(self, validated_data):
        return Account.objects.create_user(**validated_data)

在这段代码中,我什么都看不到转换为"如果Angular向具有用户名,密码和电子邮件地址的api / accounts /发送POST请求,请继续创建帐户&#34 34。

所以我的问题是:

DRF如何知道调用AccountViewSet.create(),以及在何处调用AccountSerializer.create()?

这里似乎发生了很多魔法。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

通常,在大多数情况下,每个资源的正确 REST API由2个端点组成:

  1. 列出/创建端点
  2. 详细信息(检索/更新/销毁)端点。
  3. POST请求在第一个中使用,用于创建项目。

    更详细的端点,如上所述。除了第二个端点中存在的ID之外,端点的URL通常几乎相同。例如:

    /api/items/ - 列出/创建端点,使用GET请求它将返回项目列表,使用POST请求它将创建一个新项目并将其返回序列化。

    /api/items/<item_id>/ - 详细信息端点,允许我们处理由<item_id>标识的某个项目。 GET-request返回项目,PUT请求更新整个项目(所有必填字段应存在于有效负载中,如果省略某些非必填字段 - 它的值将设置为None),PATCH-request允许部分更新项目,只更新有效负载字段中提供的,所有其他字段将保持不变)和DELETE请求,显然,删除项目。

    此类方法有时会应用一些限制,但如果您遵循它 - 您的代码将保持苗条和清晰,因为很多事情将以泛型方式完成。在项目的后端和前端部分都有。