如何修复“更新实例时,序列化程序的错误验证不确定字段”

时间:2019-05-08 22:46:52

标签: django django-models django-rest-framework django-views

我有一个组织模型,三个模型有组织模型的外键。嵌套的三个模型是用户(自定义模型),描述和联系人。用户具有唯一的字段电子邮件。说明具有唯一的两个字段对。我有用于组织的自定义序列化程序。

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__'

0 个答案:

没有答案