কীভাবে রিকোয়েস্ট পাবেন? জাঙ্গো-রেস্ট-ফ্রেমওয়ার্ক সিরিয়ালায়ার ব্যবহারকারী?


124

আমি এই জাতীয় কিছু চেষ্টা করেছি, এটি কার্যকর হয় না।

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post

    def save(self):
        user = self.context['request.user']
        title = self.validated_data['title']
        article = self.validated_data['article']

আমার সিরিয়ালাইজার ক্লাস থেকে অনুরোধ.ইউসারটি অ্যাক্সেস করতে সক্ষম হওয়ার আমার একটি উপায় দরকার।


ডিআরএফ CurrentUserDefaultএকেবারে j django-rest-framework.org/api-guide/uthorators/…
andilabs

উত্তর:


231

আপনি request.userসরাসরি অ্যাক্সেস করতে পারবেন না । আপনাকে অনুরোধের অবজেক্টটি অ্যাক্সেস করতে হবে এবং তারপরে ব্যবহারকারীর বৈশিষ্ট্যটি আনতে হবে।

এটার মত:

user =  self.context['request'].user

বা আরও নিরাপদ হতে,

user = None
request = self.context.get("request")
if request and hasattr(request, "user"):
    user = request.user

অতিরিক্ত প্রসঙ্গে আরও পড়তে পারেন এখানে


1
এটি বলেছেNameError: name 'self' is not defined
কোড্রেমন

অবশ্যই এটি একটি শ্রেণীর প্রসঙ্গে ছিল। আপনি সম্ভবত কোনও শ্রেণীর প্রসঙ্গে নন
কার্ত্তিক্র

3
আমার সিরিয়ালে, validate()পদ্ধতিতে, স্বতঃসিদ্ধ একটি খালি ডিক্স। কেন?
ডেভিড ডি

14
ডেভিড - আপনি সম্ভবত এটি অনেক আগে সমাধান করেছেন, তবে অন্য কারও কাছে যদি এই সমস্যা থাকে তবে এটি হতে পারে কারণ আপনি নিজেই নিজের সিরিয়ালটি নির্মাণ করছেন। জেনেরিক সম্পর্কের জন্য নেস্টেড সিরিয়ালাইজারে তাত্ক্ষণিকভাবে আমার এই সমস্যাটি ছিল। দস্তাবেজগুলি সিরিয়ালাইজার = নোটশিরাইজার (মান) করতে বলে তবে এটি কেবল আপনার উদাহরণটি পাস করবে, অনুরোধটি প্রসঙ্গে নয়। আপনি কাঠামো নির্মাণের জন্য কাওয়ারগুলি পাস করতে পারেন এবং এটি প্রয়োজনীয় তথ্য প্রেরণ করতে পারেন (এটি কীভাবে হয় তার জন্য get_serializer বা জেনেরিকএপিভিউ দেখুন)
জন ভন

2
@ জোনওয়াহান কীভাবে সিরিয়ালাইজারের উদাহরণে কাওয়ার্গগুলি পাস করবেন তার কোনও বিশদ ??
tyan

74

আসলে, আপনাকে প্রসঙ্গে বিরক্ত করার দরকার নেই। এটি করার আরও অনেক ভাল উপায় আছে:

from rest_framework.fields import CurrentUserDefault

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post

   def save(self):
        user = CurrentUserDefault()  # <= magic!
        title = self.validated_data['title']
        article = self.validated_data['article']

1
এটি কাজ করে না, এটি একটি নাল বস্তুর প্রত্যাবর্তন করে। ইউজার_এডিট = সিরিয়ালাইজ.কন্টেনার ইউজারডেফল্ট ()
এন্ডারসন মেনেজেস

39

ইগোর যেমন অন্য উত্তরে উল্লিখিত হয়েছে, ব্যবহার কারেন্ট ইউজারডেফল্ট ব্যবহার করতে পারে। আপনি যদি কেবলমাত্র এটির জন্য সংরক্ষণের পদ্ধতিটিকে ওভাররাইড করতে না চান, তবে ডকটি ব্যবহার করুন :

from rest_framework import serializers

class PostSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
    class Meta:
        model = Post

ডক লিঙ্কটি এখন ভুলভাবে লিঙ্কযুক্ত।
coler-j

এই একই উদাহরণের সাথে অফিসিয়াল ডিআরএফ ডকুমেন্টেশনের সাথে লিঙ্ক করুন জ্যাঙ্গো
পাওলো মেলচিয়েরে

2

কোনও দৃশ্যের ভিতরে request.userকল করার সময় আপনি পাস করতে পারেন .save(...):

class EventSerializer(serializers.ModelSerializer):

    class Meta:
        model = models.Event
        exclude = ['user']


class EventView(APIView):

    def post(self, request):
        es = EventSerializer(data=request.data)
        if es.is_valid():
            es.save(user=self.request.user)
            return Response(status=status.HTTP_201_CREATED)
        return Response(data=es.errors, status=status.HTTP_400_BAD_REQUEST)

এটি মডেল:

class Event(models.Model):
    user = models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    date = models.DateTimeField(default=timezone.now)
    place = models.CharField(max_length=255)

0

আপনার সিরিয়ালাইজারে আপনার একটি ছোট সম্পাদনা দরকার:

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post

    def save(self):
        user = self.context['request'].user
        title = self.validated_data['title']
        article = self.validated_data['article']

মডেল মিক্সিং ভিউসেটগুলি ব্যবহার করে এখানে একটি উদাহরণ দেওয়া আছে। ইন createপদ্ধতি serializer কলিং সঠিক পথ খুঁজে পাচ্ছি না। get_serializer পদ্ধতি প্রসঙ্গত অভিধানটি সঠিকভাবে পূরণ করে। যদি আপনাকে আলাদা আলাদা সিরিয়ালাইজার ব্যবহার করার প্রয়োজন হয় তবে ভিউসেটে সংজ্ঞায়িত করা হয়েছে, প্রসঙ্গত অভিধানের updateসাহায্যে সিরিয়ালাইজারটি কীভাবে শুরু করতে হবে সে পদ্ধতিটি দেখুন , যা অনুরোধের বস্তুটি সিরিয়ালেও প্রেরণ করে।

class SignupViewSet(mixins.UpdateModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet):

    http_method_names = ["put", "post"]
    serializer_class = PostSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        kwargs['context'] = self.get_serializer_context()
        serializer = PostSerializer(instance, data=request.data, partial=partial, **kwargs)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)    
        return Response(serializer.data)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.