2

Django Rest Frameworkを使用してモデルを更新するにはどうすればよいですか?Django Rest Framework - model.ModelViewSetを使用してモデルを更新する

の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 
:私は、次のモデル/シリアライザ/ビュー定義を持っています

私はこのプロジェクトで角度を使用しており、私は新しいレコードを作成することができます:

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

レコードを更新するにはどうすればよいですか?次のコードでは、新しいレコードが作成されます。

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

Iは$http.put$http.patch及び405 "メソッドが許可されていない" というエラーの両方の結果を用いて試みました。また、私は運で、URLにこのオブジェクトIDを使用して試してみました:

$http.post(`/api/v1/foo/${data.id}/`, data); 
+0

'put'または' patch'は、drfの完全更新または部分更新に使用されます。 –

+0

ありがとうございます。元の 'patch'を使って405メソッドが許可されていないというエラーが発生しました。 – Codewise

答えて

1

に答えを作成するI sに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); 
} 
1

がありcreateメソッドを介して新しいFooBarインスタンスを作成するための方法であり、シリアライザにupdate方法を使用してそれらを更新します。 Saving instancesについて

詳細

DRFドキュメントからの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 
関連する問題