2015-09-18 21 views
8

Tôi muốn người dùng chỉ có thể cập nhật một trường cụ thể. ví dụ:khung thời gian còn lại django: các trường giới hạn có thể được cập nhật

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 

khi Snippet tạo ra, người sử dụng nên chỉ có thể cập nhật title cánh đồng.

tôi biết tôi có thể đạt được điều đó bằng một cái gì đó như thế này:

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 

trong lớp serializer. nhưng tôi muốn biết, có cách nào mà api có thể duyệt chỉ hiển thị trường title trong biểu mẫu chỉnh sửa không? và cũng bỏ qua xác nhận cho các trường không bắt buộc?

Trả lời

4

Khung Django REST cung cấp các thuộc tính read_onlywrite_only để kiểm soát nội dung được sử dụng để chỉnh sửa và nội dung nào không được chỉnh sửa.

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

trên sẽ trả về tất cả các lĩnh vực trên yêu cầu đọc nhưng chỉ tiêu đề sẽ được ghi. Bạn có thể tìm thêm ở các tài liệu chính thức: http://www.django-rest-framework.org/api-guide/serializers/#specifying-read-only-fields

+1

cảm ơn! một nửa ở đó ... các trường 'read_only' đã biến mất. nhưng chúng đã biến mất trong các biểu mẫu «POST' và' PUT': ( –

0

Mã này sẽ cập nhật các thông số được gửi trong yêu cầu sẽ được cập nhật.

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

đầu tiên, cảm ơn thời gian bạn đã đăng câu trả lời này) nhưng trong câu hỏi cần chú ý: "tôi muốn biết, có cách nào mà trình duyệt api có thể duyệt được không chỉ có trường tiêu đề ở dạng chỉnh sửa? và cũng bỏ qua xác nhận cho các trường không bắt buộc? " –

+0

Trong câu hỏi bạn đã đề cập' trường giới hạn có thể được cập nhật'. Vì vậy, tôi đã viết các trường bị giới hạn –

+0

tôi đoán bạn đã hiểu lầm tôi. muốn ngăn người dùng cập nhật các trường, ngoại trừ 'tiêu đề'. người dùng cũng chỉ nên xem trường' title' trong api có thể duyệt được. –

Các vấn đề liên quan