Как исправить 'Ошибка при проверке поля unque сериализатором при обновлении экземпляра' - PullRequest
0 голосов
/ 09 мая 2019

У меня есть модель организации, и три модели имеют внешние ключи к модели организации. Три вложенные модели - это пользователи (пользовательская модель), описание и контакты. У пользователей есть уникальное поле электронной почты. Описание имеет уникальную пару из двух полей. У меня есть собственный сериализатор для организации.

class OrganisationSuperAdminSerializer(serializers.ModelSerializer):
    users = UsersSerializer(many=True, required=False)
    contacts = ContactsSerializer(many=True, required=False)
    description = DescriptionOrganisationSerializer(many=False, required=False)

    class Meta:
        model = Organisation
        fields = '__all__'

    def create(self, validated_data):
        error_msg = 'Save error'
        users_data = validated_data.pop('users')
        contacts_data = validated_data.pop('contacts')
        description_data = validated_data.pop('description')

        organisation = Organisation.objects.create(**validated_data)

        try:
            for user_data in users_data:
                Users.objects.create(organisation=organisation, **user_data)

            for contact_data in contacts_data:
                Contacts.objects.create(organisation=organisation, **contact_data)

            DescriptionOrganisation.objects.create(organisation=organisation, **description_data)
        except:
            organisation.delete()
            raise serializers.ValidationError(error_msg)

        return {}

    def update(self, instance, validated_data):
        pass

Когда я сохраняю, все идет хорошо. Но когда я пытаюсь обновить, сериализатор не проходит проверку. Текст ошибки в комментариях.

    """
    Класс для работы с данными для супер админа
    """
    queryset = Organisation.objects.all()
    serializer_class = OrganisationSuperAdminSerializer
    permission_classes = [permissions.AllowAny, ]

    def update(self, request, pk=None, *args, **kwargs):
        serializer: serializers.ModelSerializer = self.get_serializer(self.get_object(), data=request.data)
        print(serializer.is_valid()) # False
        print(serializer.errors) # {'users': [{'email': [ErrorDetail(string='email must be unique', code='unique')]}], 'description': {'non_field_errors': [ErrorDetail(string='The fields inn, kpp must make a unique set.', code='unique')]}}

        return response.Response(status=200)

Я не хочу отключать проверку уникальных полей. Но я не могу найти информацию, как проверить через обновление сериализатора.

Другие сериализаторы:

class UsersSerializer(serializers.ModelSerializer):
    email = serializers.CharField(max_length=128,
                                  validators=[validators.UniqueValidator(
                                      queryset=Users.objects.all(),
                                      message='email must be unique'
                                  )]
                                  )

    class Meta:
        model = Users
        fields = '__all__'


class DescriptionOrganisationSerializer(serializers.ModelSerializer):
    organisation = serializers.PrimaryKeyRelatedField(required=False, queryset=DescriptionOrganisation.objects.all())

    class Meta:
        model = DescriptionOrganisation
        fields = '__all__'


class ContactsSerializer(serializers.ModelSerializer):
    organisation = serializers.PrimaryKeyRelatedField(required=False, queryset=Contacts.objects.all())

    class Meta:
        model = Contacts
        fields = '__all__'
...