[英]Get current user in Model Serializer
是否可以在模型序列化程序中獲取當前用戶? 我想這樣做而不必脫離泛型,因為這是一項必須完成的簡單任務。
我的型號:
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')
關鍵是ModelSerializer
定義的方法可以訪問它們自己的上下文,它總是包括請求(當一個用戶通過身份驗證時,它包含一個用戶)。 由於我的權限僅適用於經過身份驗證的用戶,因此這里應該總有一些東西。
這也可以在其他內置的 djangorestframework 序列化器中完成。
正如 Braden Holt 指出的那樣,如果您的user
仍然為空(即_user
返回None
),則可能是因為序列化程序未將請求作為上下文的一部分進行初始化。 要解決此問題,只需在初始化序列化程序時添加請求上下文:
serializer = ActivitySerializer(
data=request.data,
context={
'request': request
}
)
一個上下文被傳遞給 REST 框架中的序列化器,它默認包含請求。 所以你可以在你的序列化器中使用self.context['request'].user
。
我有一個類似的問題 - 我試圖保存包含用戶的模型,當我嘗試使用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
我修改了 request.data:
serializer = SectionSerializer(data=add_profile_data(request.data, request.user))
def add_profile_data(data, user):
data['user'] = user.profile.id
return data
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.