Django Rest Framework - 使用 model.ModelViewSet 更新模型

Cod*_*ise 7 python django django-models django-views django-rest-framework

如何使用 Django Rest Framework 更新模型?我有以下模型/序列化器/视图定义:

foo/models.py

class FooBar (models.Model):

    title = models.CharField(max_length=255,null=False)

    def __unicode__(self):
        return self.title
Run Code Online (Sandbox Code Playgroud)

foo/serializers.py

from rest_framework import serializers
from foo.models import FooBar

class FooBarSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()

    class Meta:
        model = FooBar

        fields = ('id','title')
        read_only_fields = ['id']
Run Code Online (Sandbox Code Playgroud)

foo/views.py

from rest_framework import viewsets

from foo.models import FooBar
from foo.serializers import FooBarSerializer

class FooViewSet(viewsets.ModelViewSet):
    queryset = FooBar.objects.order_by('id')
    serializer_class = FooBarSerializer
Run Code Online (Sandbox Code Playgroud)

我在这个项目中使用了 angular,我可以说:

data = {'title':'New Foo Item'} $http.post(`/api/v1/foo/`, data );

如何更新记录?以下代码导致创建新记录。

data = {'title':'New Foo Item', 'id':1} $http.post(`/api/v1/foo/`, data )

我曾尝试使用$http.putand$http.patch并且两者都导致 405“不允许的方法”错误。我也试过在 url 中使用这个对象 id 没有运气:

$http.post(`/api/v1/foo/${data.id}/`, data );
Run Code Online (Sandbox Code Playgroud)

Cod*_*ise 5

答案是使用patch. 小心包含 Django 要求的尾部斜杠。我在第一次尝试时没有包含尾部斜杠,patch这导致了“405 Method not allowed”响应。

if ( data.id ) {
  # update
  $http.patch(`/api/v1/foo/${data.id}/`, data );
}
else {
  # create
  $http.post(`/api/v1/foo/`, data );
}
Run Code Online (Sandbox Code Playgroud)