Используйте метод validate для публикации данных, назначенных определенному пользователю, в django rest Framework

У меня есть регистрация пользователей с пользователем и проектом в качестве внешнего ключа, и с помощью сериализатора я хотел выбрать только тот проект, который назначен определенному пользователю, но я не могу понять, как использовать метод validate

class ProjectUserRegistrationSerializer(ModelSerializer):

    class Meta:
        model = ProjectUserRegistration
        fields = (
            'id',
            'date',
            'start',
            'start_note',
            'started',
            'started_at_location',
            'end',
            'end_note',
            'ended',
            'ended_at_location',
            'project',
        )

    def create(self, validated_data):
        user_obj = ProjectUserRegistration.objects.create(
            **validated_data,
            user=self.context['request'].user
        )
        return user_obj

и это мой набор взглядов

class ProjectUserRegistrationViewSet(viewsets.ModelViewSet):
    authentication_classes = [authentication.TokenAuthentication, authentication.SessionAuthentication]
    queryset = ProjectUserRegistration.objects.none()
    serializer_class = ProjectUserRegistrationSerializer

    def get_serializer_context(self):
        context = super(ProjectUserRegistrationViewSet, self).get_serializer_context()
        context.update({
            'request': self.request,
        })
        return context

Вы можете валидировать и поле с помощью validate_fieldname, например, вы можете сделать (в зависимости от того, как настроено отображение пользователя/проекта)

class ProjectUserRegistrationSerializer(ModelSerializer):
    ...

    def validate_project(self, value):
        user_id = self.context['request'].user.pk
        if not value.users.filter(pk=user_id).exists():
            raise serializers.ValidationError("You are not welcome in this project.")

И несколько совершенно несвязанных комментариев

Вероятно, вы хотите, чтобы поле id (и, возможно, некоторые другие) было доступно только для чтения, что вы и делаете, добавляя read_only_fields = ('id',) к вашему классу Meta.

context = super(ProjectUserRegistrationViewSet, self).get_serializer_context()

можно упростить до просто

context = super().get_serializer_context()

Если вы не планируете поддерживать python2.

Догадываюсь, как выглядит модель проекта.

class ProjectUserRegistrationSerializer(ModelSerializer):
    class Meta:
        model = ProjectUserRegistration
        fields = (
            'id',
            'date',
            'start',
            'start_note',
            'started',
            'started_at_location',
            'end',
            'end_note',
            'ended',
            'ended_at_location',
            'project',
        )

    def validate(self, attrs):
        # validated the data first 
        validated_data = super().validate(attrs)
        # Grab user and project from validated data
        user = validated_data.get("user")
        project = validated_data.get("project")
        if Project.objects.filter(id=project.id, users__in=[user]).exists() == False:
            raise ValidationError("user not added to project")
        return validated_data
Вернуться на верх