【问题标题】:how to access context in serializer queryset如何在序列化程序查询集中访问上下文
【发布时间】:2022-09-29 16:03:04
【问题描述】:

我正在寻找一种访问上下文以按当前用户过滤的方法

 class RemovePermissionsSerializer(serializers.Serializer):
        user_permissions = serializers.PrimaryKeyRelatedField(
            many=True, queryset=Permission.objects.filter(user = context.get(\'request\').user)
        )

我无法访问上下文,因为它未定义,self.context 也没有

    标签: django django-rest-framework


    【解决方案1】:

    为了实现那个覆盖获取字段方法在RemovePermissionsSerializer如下所示:

    class RemovePermissionsSerializer(serializers.Serializer):
    
    def get_fields(self):
        fields = super().get_fields()
        # If you want your logic according to request method
        request = self.context.get('request')
        if request and request.method.lower() == "<your method here>":
            fields['user_permissions'] = serializers.PrimaryKeyRelatedField(
                many=True, queryset=Permission.objects.filter(user=request.user)
            )
        
        return fields
    

    如果您想根据操作更改表示,您可以执行以下操作:

    class RemovePermissionsSerializer(serializers.Serializer):
    
    def get_fields(self):
        fields = super().get_fields()
        # IF you want your logic according to action
        view = self.context.get('view')
        if view and view.action == "<action name>":
            fields['user_permissions'] = serializers.PrimaryKeyRelatedField(
                many=True, queryset=Permission.objects.filter(user=request.user)
            )
        return fields
    

    【讨论】:

      【解决方案2】:

      您在初始化序列化程序时是否提供了上下文?如果您希望上下文在序列化程序中可用,则必须自己提供,例如:

      serializer = RemovePermissionsSerializer(instance, context={"request": request})
      

      或者

      serializer = RemovePermissionsSerializer(instance, context={"user": request.user})
      

      也就是说,请求上下文不会在序列化程序中自动可用

      【讨论】:

      • 是的,我做到了,serializer = self.get_serializer(data=request.data, context={'request': request})
      • 您能否更新您的帖子,以便我们看到您遇到的错误?最好查看您从中启动序列化程序的完整视图集。
      【解决方案3】:

      另一种选择是使用一种方法制造序列化程序,例如:

      def get_remove_permission_serializer(user):      
          class RemovePermissionsSerializer(serializers.Serializer):
                      user_permissions = serializers.PrimaryKeyRelatedField(
                          many=True, queryset=Permission.objects.filter(user = user)
                      )
          return RemovePermissionsSerializer
      

      我认为它比公认的答案更干净,但它可能是一种反模式

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-08
        • 2015-04-23
        • 2022-08-19
        • 2021-12-27
        • 1970-01-01
        • 2017-11-28
        • 1970-01-01
        • 2020-01-11
        相关资源
        最近更新 更多