【问题标题】:Django Rest Framework: validate HiddenField CurrentUserDefault propertyDjango Rest Framework:验证 HiddenField CurrentUserDefault 属性
【发布时间】:2022-01-14 20:53:58
【问题描述】:

我正在使用 DRF 在单页应用程序中创建 API。 我有一个客户用户类,我只添加了一个 is_manager 标志和一个 managerEntity 模型,其中具有 is_manager 标志为 True 的用户可以创建 managerEntity 成为它们的所有者。 问题是我似乎无法弄清楚如何在创建方法之前验证来自序列化程序的数据以检查 is_manager 是否已设置。如果设置,则应该创建 managerEntity,如果没有,则引发异常。

class DeepmetricsUser(AbstractUser):
    is_manager = models.BooleanField(default=False)

class managerEntity(models.Model):
    id              = models.AutoField(primary_key=True)
    name            = models.CharField(max_length=200)
    owner           = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    team            = models.ManyToManyField(get_user_model(), blank=True)

views.py

class managersEntityViewSet(viewsets.ModelViewSet):

    queryset = managerEntity.objects.all()
    serializer_class = managerEntityModelSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        return self.queryset.filter(Q(owner = self.request.user) | Q(team=self.request.user.id))


    def create(self, request, *args, **kwargs):
        serializer = managerEntitySerializer(data=request.data, context={"request": self.request})
        serializer.is_valid(raise_exception=True)
        res = serializer.save()
        data = managerEntityModelSerializer(res).data
        return Response(data, status=status.HTTP_201_CREATED)

serializer.py

class managerEntitySerializer(serializers.Serializer):
    name    = serializers.CharField(max_length=255)
    owner   = serializers.HiddenField(default=serializers.CurrentUserDefault())
        
    def create(self, data):
        res = managerEntity.objects.create(**data)
        return res

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    你需要重写序列化器中的validate方法

    def validate(self, attrs):
       if not self.context["request"].user.is_manager:
          raise serializers.ValidationError("Validation error")
       return attrs
    

    【讨论】:

    • 谢谢!尽管从请求中获取用户对象与从 serializers.CurrentUserDefault() 获取相同,但这仍按预期工作 编辑:完全相同:class CurrentUserDefault: requires_context = True def __call__(self, serializer_field): return serializer_field.context['request'].user
    【解决方案2】:

    通过使用权限,我找到了更适合我需求的解决方案。 Shakeel 提供的答案是正确的,因为我要求进行验证,应该按照他的建议进行,但是,我真正想做的是检查用户是否有足够的权限来操作资源,然后,权限是最合适的:

    class createManagerEntity(BasePermission):
    message = "Not enough privilegies"
    def has_permission(self, request, view):
        return request.user.is_manager
    

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 2020-10-13
      • 2019-01-01
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 2021-11-27
      • 2013-05-03
      相关资源
      最近更新 更多