اذهب إلى المحتوى

السؤال

نشر (معدل)

أحاول الحصول على المستخدم الحالي (الذي قام بعمل الطلب request) في داخل نموذجserializers، لقد جربت الكود التالي، ولكنه لا يعمل.

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post

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

كيف يمكنني الوصول إلى request.user من صنف Serializer الخاص بي؟

تم التعديل في بواسطة Amer Abdallah

Recommended Posts

  • 1
نشر

لا يمكنك الوصول إلى مستخدم الطلب مباشرة. تحتاج إلى الوصول إلى كائن الطلب ، ثم إحضار سمة المستخدم.

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

والطريقة الأكثر أمانًا (لا يظهر خطأ KeyError أو خطأ AttributeError) كالتالي:

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

كما يوفر Django-Rest-Framework طريقة أسهل للوصول إلى المستخدم الحالي من خلال إستخدام التابع CurrentUserDefault كالتالي:

from rest_framework.fields import CurrentUserDefault

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post

    def save(self):
        user = CurrentUserDefault()  # الحصول على المستخدم الحالي

 

  • 0
نشر

كما ذكر سامح يمكنك استخدام CurrentUserDefault. إذا كنت لا تريد عمل override لدالة save فيمكنك استخدام الكود كالتالي

from rest_framework import serializers

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

 

  • 0
نشر

يمكنك أيضاً تمرير request.user عند استدعاء الدالة (...)save. داخل ال view:

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)

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...