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

9
如何使用Django Rest Framework更新模型?以下是我的模型/序列化器/视图定义:
foo/models.py
class FooBar (models.Model):

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

    def __unicode__(self):
        return self.title

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']

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

在这个项目中,我使用了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.put` 和 `$http.patch` 方法,但都返回 405 "Method not allowed" 错误。我还尝试在 URL 中使用对象 ID,但没有成功。
$http.post(`/api/v1/foo/${data.id}/`, data );

在DRF中,putpatch用于进行完整或部分更新。 - Deep 3015
谢谢。我在最初尝试使用“patch”时错过了一个尾部斜杠,导致405方法不允许的错误。 - Maverik Minett
2个回答

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 );
}

4

在序列化器中,可以通过create方法创建一个新的FooBar实例,并使用update方法更新它们。

有关从DRF文档保存实例的更多详细信息,请参见Saving instances

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']
    def create(self, validated_data):
        # Create the Foo instance
        foo = FooBar.objects.create(title=validated_data['title'])
        return foo
    def update(self, instance, validated_data):
        # Update the Foo instance
        instance.title = validated_data['title']
        instance.save()
        return instance

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

更新

data = {'title':'New Foo Item'}
$http.put('/api/v1/foo/'+id+'/', data ); //where `id` is the Foo Item ID

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接