Python 获取模型序列化程序中的当前用户

Python 获取模型序列化程序中的当前用户,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,是否可以在模型序列化程序中获取当前用户?我希望这样做而不必脱离泛型,因为这是一项必须完成的简单任务 我的模型: class Activity(models.Model): number = models.PositiveIntegerField( blank=True, null=True, help_text="Activity number. For record keeping only.") instructions = models.TextField(

是否可以在模型序列化程序中获取当前用户?我希望这样做而不必脱离泛型,因为这是一项必须完成的简单任务

我的模型:

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"
我的序列化程序:

class ActivitySerializer(serializers.ModelSerializer):

    class Meta:
        model = Activity
serializer = ActivitySerializer(
    data=request.data,
    context={
        'request': request
    }
)
我的看法是:

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
}

我通过查看DRF源代码找到了答案

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):
        request = self.context.get('request', None)
        if request:
            return request.user

    class Meta:
        model = Activity
        # Add our custom method to the fields of the serializer
        fields = ('id','current_user')
关键是在
ModelSerializer
中定义的方法可以访问它们自己的上下文,该上下文始终包括请求(当一个用户经过身份验证时,该请求包含一个用户)。因为我的权限只针对经过身份验证的用户,所以这里应该总是有一些东西

这也可以在其他内置djangorestframework序列化程序中完成

正如Braden Holt指出的,如果您的
用户
仍然为空(即
\u用户
返回
),这可能是因为序列化程序没有使用请求作为上下文的一部分进行初始化。要解决此问题,只需在初始化序列化程序时添加请求上下文:

class ActivitySerializer(serializers.ModelSerializer):

    class Meta:
        model = Activity
serializer = ActivitySerializer(
    data=request.data,
    context={
        'request': request
    }
)

上下文被传递到REST框架中的序列化程序,该序列化程序默认包含请求。因此,您可以在序列化程序中使用
self.context['request'].user

我修改了请求。数据:

serializer = SectionSerializer(data=add_profile_data(request.data, request.user))

def add_profile_data(data, user):
    data['user'] = user.profile.id
    return data

我有一个类似的问题-我试图保存由用户组成的模型,当我试图使用
user=serializers.StringRelatedField(read_only=True,default=serializers.CurrentUserDefault())
与官方文档类似-但它会抛出一个错误,即用户为
'null'
。重写默认的
create
方法,并从“帮助我的请求”中获取用户:

class FavoriteApartmentsSerializer(serializers.ModelSerializer):
user = serializers.StringRelatedField(read_only=True, default=serializers.CurrentUserDefault())

class Meta:
    model = FavoriteApartments
    exclude = (
        'date_added',
    )

def create(self, validated_data):
    favoriteApartment = FavoriteApartments(
        apartment=validated_data['apartment'],
        user=self.context['request'].user
    )
    favoriteApartment.save()
    return favoriteApartment

如何访问该变量?我的设置与此类似,但在create()方法中,我似乎无法访问变量。它也不在request.POST中。我使用了上面的代码,但给出了以下错误文件“/Users/abc/abc/Django/Work/abc/abc/src/MadhaparGamApps/serializers/newsfeedSerializer.py”,第21行,在_useruser=self.context['request'].user KeyError:“请求”对于每个获得请求密钥的人来说都是错误的:您可以通过使用请求对象从视图中初始化序列化程序来解决此问题,如下所示:serializer=serializers.RandomSerializer(data=request.data,context={'request':request})源:@Braden Holt Thank dude,您为meDo节省了大量时间您知道DRF在源代码的序列化程序上下文中插入请求信息的位置吗?您知道DRF在源代码的序列化程序上下文中插入请求信息的位置吗?这不再是事实,您需要向序列化程序传递额外的上下文。请参见@Akshay Strange,它仍然适用于我,但没有明确传递DRF 3.9.4中的上下文。