2015-09-18 17 views
8

Ich möchte Benutzer in der Lage sein, nur ein bestimmtes Feld zu aktualisieren. zum Beispiel:django rest framework: limit Felder, die aktualisiert werden können

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 

einmal die Snippet erstellt, Benutzer sollte nur in der Lage sein title zu aktualisieren Feld.

ich weiß, ich, dass durch so etwas wie dies erreichen können:

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 

in Serializer-Klasse. aber ich möchte wissen, gibt es eine Möglichkeit, dass durchsuchbare api nur title Feld in Bearbeitungsform anzeigen? und die Validierung für Felder, die nicht benötigt werden, überspringen?

Antwort

4

Django REST Framework bietet die Attribute read_only und write_only Attribute für die Kontrolle, was für die Bearbeitung verwendet wird und was nicht.

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

Die oben kehren alle Felder auf Leseanforderungen aber nur werden Titel beschreibbar sein. Sie können mehr in der offiziellen Dokumentation finden: http://www.django-rest-framework.org/api-guide/serializers/#specifying-read-only-fields

+1

Dank! Auf halbem Wege ... sind die 'read_only' Felder weg. aber sie sind weg in "POST" und "PUT" Formen :(. –

0

Dieser Code aktualisiert die Parameter, die in der Anfrage gesendet werden Updates sein.

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

erstens, danke für die Zeit, die Sie ausgegeben haben, diese Antwort. Aber in Frage achten Sie auf: "Ich möchte wissen, gibt es einen Weg, der durchsuchbare API zeigen Nur Titelfeld im Bearbeitungsformular? und auch Validierung für Felder, die nicht erforderlich sind? –

+0

In der Frage, die Sie erwähnten, begrenzen Felder, die aktualisiert werden können. So schrieb ich die begrenzten Felder. –

+0

ich denke, Sie missverstanden mich Ich möchte verhindern, dass der Benutzer Felder aktualisiert, mit Ausnahme von 'title'. Außerdem sollte der Benutzer das Feld' title' nur in der durchsuchbaren API sehen. –

Verwandte Themen