2015-09-18 9 views
8

अपडेट किया जा सकता है, मैं चाहता हूं कि उपयोगकर्ता केवल एक विशिष्ट फ़ील्ड अपडेट कर सकें। उदाहरण के लिए: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 

serializer कक्षा में:

मैं मैं कुछ इस तरह से है कि प्राप्त कर सकते हैं पता है। लेकिन मैं जानना चाहता हूं, क्या ऐसा कोई तरीका है कि ब्राउज़ करने योग्य एपीआई केवल title फ़ील्ड को संपादित फॉर्म में दिखाए? और उन क्षेत्रों के सत्यापन को भी छोड़ दें जिनकी आवश्यकता नहीं है?

उत्तर

4

Django REST फ्रेमवर्क read_only और write_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

सबसे पहले, इस उत्तर को पोस्ट करने में आपके द्वारा खर्च किए गए समय के लिए धन्यवाद। लेकिन सवाल में ध्यान दें: "मैं जानना चाहता हूं, क्या कोई तरीका है कि ब्राउज़ करने योग्य एपीआई शो केवल संपादन फ़ील्ड में शीर्षक फ़ील्ड? और उन फ़ील्ड के लिए सत्यापन भी छोड़ें जिनकी आवश्यकता नहीं है? " –

+0

प्रश्न में आपने उल्लेख किया है कि सीमा फ़ील्ड जिन्हें अपडेट किया जा सकता है। इसलिए मैंने सीमित फ़ील्ड लिखे हैं। –

+0

मुझे लगता है कि आपने मुझे गलत समझा। 'शीर्षक' को छोड़कर, उपयोगकर्ता को फ़ील्ड अपडेट करने से रोकना चाहते हैं। उपयोगकर्ता को केवल ब्राउज़ करने योग्य एपीआई में 'शीर्षक' फ़ील्ड देखना चाहिए। –