是否可以在模型序列化器中获取当前用户?我希望这样做而不必脱离泛型,因为这是一项必须完成的简单任务。
我的型号:
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
以及我的看法:
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')
关键是在 a 中定义的方法ModelSerializer
可以访问自己的上下文,其中始终包含请求(经过身份验证后包含用户)。由于我的权限仅适用于经过身份验证的用户,因此这里应该始终有一些内容。
这也可以在其他内置 djangorestframework 序列化器中完成。
正如布雷登霍尔特指出的,如果你user
仍然是空的(即_user
正在返回None
),这可能是因为序列化器未使用请求作为上下文的一部分进行初始化。要解决此问题,只需在初始化序列化器时添加请求上下文即可:
serializer = ActivitySerializer(
data=request.data,
context={
'request': request
}
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)