2015-01-14 10 views
22

में वर्तमान उपयोगकर्ता प्राप्त करें क्या मौजूदा उपयोगकर्ता को मॉडल धारावाहिक में प्राप्त करना संभव है? मैं जेनेरिक से दूर शाखा के बिना ऐसा करना चाहता हूं, क्योंकि यह एक अन्यथा आसान काम है जो किया जाना चाहिए।मॉडल Serializer

मेरे मॉडल:

class Activity(models.Model): 
    number = models.PositiveIntegerField(
     blank=True, null=True, help_text="Activity number. For record keeping only.") 
    instructions = models.TextField() 
    difficulty = models.ForeignKey(Difficulty) 
    categories = models.ManyToManyField(Category) 
    boosters = models.ManyToManyField(Booster) 

    class Meta(): 
     verbose_name_plural = "Activities" 

मेरे serializer:

class ActivitySerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Activity 

और मेरे विचार:

class ActivityDetail(generics.RetrieveUpdateDestroyAPIView): 

    queryset = Activity.objects.all() 
    serializer_class = ActivityDetailSerializer 

मॉडल एक अतिरिक्त क्षेत्र के साथ, लौटे मैं कैसे प्राप्त कर सकते हैं user ऐसा है कि मेरी प्रतिक्रिया इस तरह दिखती है:

{ 
    "id": 1, 
    "difficulty": 1, 
    "categories": [ 
     1 
    ], 
    "boosters": [ 
     1 
    ], 
    "current_user": 1 //Current authenticated user here 
} 

उत्तर

30

मुझे Djangorestframework स्रोत कोड के माध्यम से उत्तर मिला।

class ActivitySerializer(serializers.ModelSerializer): 

    # Create a custom method field 
    current_user = serializers.SerializerMethodField('_user') 

    # Use this method for the custom field 
    def _user(self, obj): 
     user = self.context['request'].user 
     return user 

    class Meta: 
     model = Activity 
     # Add our custom method to the fields of the serializer 
     fields = ('id','current_user') 

कुंजी तथ्य यह है कि एक ModelSerializer अंदर परिभाषित तरीकों को अपने स्वयं के संदर्भ है, जो हर बार अनुरोध (जो जब एक प्रमाणित है एक उपयोगकर्ता होता है) भी शामिल है के लिए उपयोग किया है। चूंकि मेरी अनुमति केवल प्रमाणित उपयोगकर्ताओं के लिए है, इसलिए हमेशा यहां कुछ होना चाहिए।

यह अन्य अंतर्निहित djangorestframework serializers में भी किया जा सकता है।

+0

आप उस चर का उपयोग कैसे करते हैं? मैंने अपनी तरह ही सेट अप किया है, लेकिन बनाने() विधि में, मैं चर का उपयोग नहीं कर सकता। यह अनुरोध में भी नहीं है। POST। – Craig

+0

मैंने उपरोक्त कोड का उपयोग किया लेकिन निम्नलिखित त्रुटि फ़ाइल "/Users/abc/abc/Django/Work/abc/abc/src/MadhaparGamApps/serializers/newsfeedSerializer.py", लाइन 21, _user उपयोगकर्ता = self.context में ['request']। उपयोगकर्ता कुंजी त्रुटि: 'अनुरोध' –

+1

अनुरोध प्राप्त करने वाले सभी के लिए KeyError: आप इसे हल कर सकते हैं, अनुरोधकर्ता ऑब्जेक्ट के साथ दृश्य से सीरियलज़र को प्रारंभ करके निम्नानुसार है: serializer = serializers.RandomSerializer (डेटा = request.data, संदर्भ = {'अनुरोध': अनुरोध}) स्रोत: http://www.django-rest-framework.org/api-guide/serializers/#saving-instances –

13

आरईएसटी ढांचे में धारावाहिक को एक संदर्भ पारित किया गया है, जिसमें डिफ़ॉल्ट रूप से अनुरोध शामिल है। तो आप अपने serializer के अंदर बस self.context['request'].user का उपयोग कर सकते हैं।

संबंधित मुद्दे