我认为最好用代码示例来解释。
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()?
这里似乎发生了很多魔法。
感谢您的帮助。
答案 0 :(得分:1)
通常,在大多数情况下,每个资源的正确 REST API由2个端点组成:
POST请求在第一个中使用,用于创建项目。
更详细的端点,如上所述。除了第二个端点中存在的ID之外,端点的URL通常几乎相同。例如:
/api/items/
- 列出/创建端点,使用GET请求它将返回项目列表,使用POST请求它将创建一个新项目并将其返回序列化。
/api/items/<item_id>/
- 详细信息端点,允许我们处理由<item_id>
标识的某个项目。 GET-request返回项目,PUT请求更新整个项目(所有必填字段应存在于有效负载中,如果省略某些非必填字段 - 它的值将设置为None
),PATCH-request允许部分更新项目,只更新有效负载字段中提供的,所有其他字段将保持不变)和DELETE请求,显然,删除项目。
此类方法有时会应用一些限制,但如果您遵循它 - 您的代码将保持苗条和清晰,因为很多事情将以泛型方式完成。在项目的后端和前端部分都有。