2015-09-18 26 views
8

特定のフィールドを1つしか更新できないようにしたい。例えば:django rest framework:更新可能なフィールドを制限する

models.py

class Snippet(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    title = models.CharField(max_length=100, blank=True, default='') 
    code = models.TextField() 
    linenos = models.BooleanField(default=False) 
    language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100) 
    style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100) 

    class Meta: 
     ordering = ('created',) 

serializer.py

class SnippetSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Snippet 
     fields = ('id', 'title', 'code', 'linenos', 'language', 'style') 

views.py

class SnippetList(generics.ListCreateAPIView): 
    queryset = Snippet.objects.all() 
    serializer_class = SnippetSerializer 


class SnippetDetail(generics.RetrieveUpdateDestroyAPIView): 
    queryset = Snippet.objects.all() 
    serializer_class = SnippetSerializer 

作成Snippet一度、ユーザーはtitleを更新することができるはずですフィールド。シリアライザクラスの

serializers.py

def update(self, instance, validated_data): 
     """ 
     Update and return an existing `Snippet` instance, given the validated data. 
     """ 
     instance.title = validated_data.get('title', instance.title) 
     instance.save() 
     return instance 

は、私はこのような何かでそれを達成することができます知っています。しかし私は知りたいです、閲覧可能なAPIが編集フォームのフィールドtitleだけを表示する方法はありますか?必要でないフィールドの検証もスキップしますか?

答えて

4

Django REST Frameworkは、編集に使用するものと使用しないものを制御するためにread_onlywrite_onlyの属性を提供します。

serializers.py

class SnippetSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Snippet 
     fields = ('id', 'title', 'code', 'linenos', 'language', 'style') 
     extra_kwargs = { 
      'id': {'read_only': True}, 
      'code': {'read_only': True}, 
      'lineos': {'read_only': True}, 
      'language': {'read_only': True}, 
      'style': {'read_only': True} 
     } 

上記読み取り要求のすべてのフィールドを返しますが、タイトルだけが書き込み可能になります。このコードは、要求で送信されたパラメータがアップデートされますが更新されます http://www.django-rest-framework.org/api-guide/serializers/#specifying-read-only-fields

+1

感謝!途中で 'read_only'フィールドがなくなりました。しかし、彼らは 'POST'と' PUT'形式で行っています:(。 –

0

: あなたは公式ドキュメントで詳細を見つけることができます。

views.py

class SnippetSerializer(viewset.ModelViewSet): 
    queryset = Snippet.objects.all() 
    serializer_class = SnippetSerializer 
    http_method_names = ['put'] 

    def update(self, request, *args, **kwargs): 
     snippet = self.get_object() 
     serializer = self.get_serializer(snippet, data=request.data, partial=True) 
     serializer.is_valid(raise_exception=True) 
     self.perform_update(serializer) 
     return Response(serializer.data) 
+0

まず、この回答を投稿するのに感謝しますが、問題に注意してください: "私は知ってほしい、閲覧可能なAPIの表示方法はありますか?編集フォームのタイトルフィールドのみですか?必須ではないフィールドの検証をスキップしますか?」 –

+0

「制限フィールドを更新できる」と言われていたので、私は限定フィールドを書いた。 –

+0

私はあなたを誤解していると思う。 'title'を除いてフィールドを更新しないようにしたいのですが、ユーザーはブラウズ可能なAPIの' title'フィールドだけを見るべきです。 –

関連する問題