django метод обновления структуры отдыха - PullRequest
2 голосов
/ 14 февраля 2020

я должен использовать функцию is_valid () для проверки моих пользовательских данных в функции put () в drf? потому что когда я его использую, is_valid.errors говорит, что модель с этим именем пользователя и адресом электронной почты уже существует! Я не могу понять смысл ошибок, потому что я думаю, что должно быть что-то сохранено, прежде чем я хочу обновить

serializers.py

class UserCreateSerializers(ModelSerializer):
class Meta:
    model = User
    fields = ('name','email','family',"username","password","profile_pic")

def update(self, instance, validated_data):
    print("from update try")       

    #more dry  
    for i in validated_data.keys():
        if hasattr(instance,str(i)) and str(i) !="password":
            setattr(instance,str(i),validated_data.get(str(i)))

        elif hasattr(instance,str(i)) and str(i) =="password":
            instance.set_password(validated_data.get('password'))

    setattr(instance,"username",validated_data.get('new_username'))
    instance.save()

views.py

    def put(self,request):

    username = request.data['username']
    user = User.objects.get(username = username)
    serialized = UserCreateSerializers(data = request.data)

    if serialized.is_valid():
        serialized.update(user,serialized.validated_data)
        return Response(data ={"status":"api_user_update_ok"} , status = status.HTTP_201_CREATED)

    else:
        print(serialized.errors)
        return Response(data = {"status":"api_user_update_failed","error":serialized.errors.get('email')[0]},status = status.HTTP_400_BAD_REQUEST)

данные клиента с методом put:

name:user
family:useri
username:user2
password:1234
new_username:user22
email:user@gmail.com

ошибка:

{'email': [ErrorDetail (строка = 'пользователь с таким адресом электронной почты уже существует.', Code = 'unique')], 'username': [ErrorDetail (string = 'пользователь с таким именем пользователя уже существует. ', code =' unique ')]} Неверный запрос: / api / v0 / registration / signup

и ответ сервера:

{
    "status": "api_user_update_failed",
    "error": "user with this email already exists."
}

спасибо за вашу помощь.

1 Ответ

2 голосов
/ 14 февраля 2020

Краткий ответ: да, вы должны использовать is_valid(), прежде чем пытаться сохранить полученные данные в БД. Вы видите эту ошибку, потому что DRF по умолчанию добавляет валидатор уникальности в уникальные поля. Это поведение описано в do c.

Чтобы сообщить django, что вы обновляете объект и вам не нужен валидатор уникальности, вы должны предоставить экземпляр сериализатору:

serialized = UserCreateSerializers(user, data=request.data)
...