簡體   English   中英

在模型序列化程序中獲取當前用戶

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM