2015-09-18 12 views
8

Chcę, aby użytkownicy mogli aktualizować tylko jedno konkretne pole. na przykład:Struktura reszta django: pola limitów, które można aktualizować

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 

raz Snippet stworzonego, użytkownik powinien być tylko w stanie zaktualizować title pole.

wiem, że można to osiągnąć przez coś takiego:

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 

w klasie serializer. ale chcę wiedzieć, czy istnieje sposób, w jaki można wyświetlać tylko pole api show-only title w formularzu edycji? a także pominąć sprawdzanie poprawności dla pól, które nie są wymagane?

Odpowiedz

4

Django REST Framework udostępnia atrybuty read_only i write_only do kontrolowania tego, co jest używane do edycji, a co nie.

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

Powyższy zwróci wszystkie pola na żądania odczytu lecz tylko tytuł będzie zapisywać. Więcej informacji można znaleźć w oficjalnej dokumentacji: http://www.django-rest-framework.org/api-guide/serializers/#specifying-read-only-fields

+1

dzięki! w połowie drogi ... pola 'read_only' zniknęły. ale nie ma ich w formularzach "POST" i "PUT" :(. –

0

Ten kod zaktualizuje parametry, które zostaną wysłane w żądaniu, będzie aktualizacją.

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

po pierwsze, dziękuję za poświęcenie czasu na opublikowanie tej odpowiedzi, ale w pytaniu zwracaj uwagę na: "chcę wiedzieć, czy istnieje sposób na przeglądanie api tylko pole tytułu w formularzu edycji ?, a także pominąć sprawdzanie poprawności dla pól, które nie są wymagane? " –

+0

W pytaniu wspomniałeś o' polach limitów, które można aktualizować. 'Więc napisałem ograniczone pola –

+0

Myślę, że źle mnie zrozumiałeś. chce uniemożliwić użytkownikowi aktualizację pól, z wyjątkiem "title". Również użytkownik powinien widzieć tylko pole "title" w api do przeglądania. –

Powiązane problemy