2015-03-10 13 views
11

साथ मैं Django के बाकी फ्रेमवर्क में आ ModelViewSet है कि मुझे एक पोस्ट करते हैं और निम्नलिखित पते के माध्यम से प्राप्त करने की क्षमता देता:अधिभावी Django बाकी ViewSet कस्टम पोस्ट विधि और मॉडल

api/v1/users

ये उपयोगकर्ता आ है एक टिप्पणियाँ तालिका के संबंध रिवर्स और मैं यूआरएल के माध्यम से इन टिप्पणियां उपयोग करने में सक्षम होना चाहते हैं:

api/v1/users/<username>/comments

मैं एक सेट करके ऐसा करने में सक्षम था कस्टम @detail_routequeryset और serializer_class ओवरराइड करके यह केवल GET अनुरोधों के लिए काम करता है।

class UserViewSet(viewsets.ModelViewSet): 
    queryset   = User.objects.all() 
    serializer_class = UserFlat 
    lookup_field  = 'username' 


    @detail_route(methods=['post','get']) 
    def comment(self, request, **kwargs): 

     user = self.get_object() 

     self.queryset   = Comment.objects.filter(recipient=user.id) 
     self.serializer_class = CommentFlat 

     serializer = CommentFlat(instance=self.queryset, many=True) 

     return Response(serializer.data) 

नई टिप्पणी लेना चाहिए: यदि मैं बाकी फ्रेमवर्क के व्यवस्थापक अनुभाग के माध्यम से एक नई टिप्पणी पोस्ट करने का प्रयास है, मैं कहा " 'ListSerializer' वस्तु iterable नहीं है"

यहाँ मेरी कोड है एक त्रुटि नोटिस प्राप्त निम्नलिखित मानकों:

comment.author, comment.message, comment.recipient

मैं व्यवस्थापक पैनल में उन सभी क्षेत्रों में प्रवेश करने और एक पोस्ट अनुरोध बनाने का प्रयास है, लेकिन यह विफल रहता है सकते हैं। आदर्श रूप में, मैं केवल comment.message और comment.author और comment.recipient क्षेत्र user.id जो यूआरएल में प्राप्त किया जाता है के साथ autopopulated किया जाना चाहिए को भरने के लिए होना चाहिए api/v1/users/<username>/comments

क्या किसी को पता है कि क्यों मेरी पोस्ट अनुरोध नहीं है पूरा करना और मैं उस क्षेत्र को कैसे स्वत: भर सकता हूं?

उत्तर

14

मैंने इसे समझ लिया। उन लोगों के लिए जो उत्तर की तलाश में हैं, समाधान request.method == 'POST' पर होने वाली कार्रवाइयों को स्पष्ट रूप से परिभाषित करना था और ऑब्जेक्ट को धारावाहिक में पास करना था।

@detail_route(methods=['post','get']) 
    def comment(self, request, **kwargs): 

     user = self.get_object() 

     self.queryset = Comment.objects.filter(recipient=user.id) 
     self.serializer_class = CommentFlat 

     if request.method == 'POST': 

      # request.data is from the POST object. We want to take these 
      # values and supplement it with the user.id that's defined 
      # in our URL parameter 
      data = { 
       'comment': request.data['comment'], 
       'rating': request.data['rating'], 
       'author': request.data['author'], 
       'recipient': user.id 
      } 

      serializer = CommentFlat(data=data) 

      if serializer.is_valid(): 
       serializer.save() 
       return Response(serializer.data, status=status.HTTP_201_CREATED) 
      else: 
       return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

     # Return GET by default 
     else: 

      serializer = CommentFlat(instance=self.queryset, many=True) 

      return Response(serializer.data) 
संबंधित मुद्दे