Используйте метод 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