Django Rest Framework: проверка свойства HiddenField CurrentUserDefault
Я использую DRF для создания API в одностраничном приложении. У меня есть класс пользователя customer, к которому я добавил только флаг is_manager и модель managerEntity, в которой пользователи, имеющие флаг is_manager как True, могут создавать managerEntity, становясь их владельцами. Проблема в том, что я не могу понять, как проверить данные из сериализатора перед методом create, чтобы проверить, установлен ли флаг 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
Вам необходимо переопределить метод validate
в Serializer
def validate(self, attrs):
if not self.context["request"].user.is_manager:
serializers.ValidationError("Validation error")
return attrs
Я нашел решение, которое лучше соответствует моим потребностям, используя разрешения. Ответ, предоставленный Shakeel, верен, поскольку я просил проверку, и это должно быть сделано, как он предложил, но то, что я действительно хотел сделать, это проверка достаточного разрешения для пользователя манипулировать ресурсом, тогда разрешения - это то, что лучше всего подходит:
class createManagerEntity(BasePermission):
message = "Not enough privilegies"
def has_permission(self, request, view):
return request.user.is_manager