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

كيفية إستخدام request.user في نموذج serializers في جانغو Django؟

Amer Abdallah

السؤال

أحاول الحصول على المستخدم الحالي (الذي قام بعمل الطلب 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...