Ответ 1
Проблема заключается в том, что DRF просто задает значения полей в модели. Поэтому пароль задается в поле пароля и сохраняется в базе данных. Но чтобы правильно установить пароль, вам нужно вызвать метод set_password()
, который будет выполнять хеширование.
Существует несколько способов сделать это, но лучший способ в rest framework v3 - переопределить методы update()
и create()
на вашем Serializer.
class UserSerializer(serializers.ModelSerializer):
# <Your other UserSerializer stuff here>
def create(self, validated_data):
password = validated_data.pop('password', None)
instance = self.Meta.model(**validated_data)
if password is not None:
instance.set_password(password)
instance.save()
return instance
def update(self, instance, validated_data):
for attr, value in validated_data.items():
if attr == 'password':
instance.set_password(value)
else:
setattr(instance, attr, value)
instance.save()
return instance
Две вещи здесь:
- пользователь
self.Meta.model
, поэтому, если модель изменена на serializer, он все еще работает (пока он имеетset_password
метод, конечно). - мы перебираем элементы
validated_data
, а не поля, для учета необязательных полейexclude
ed.
Кроме того, эта версия create
не сохраняет отношения M2M. Не требуется в вашем примере, но при необходимости его можно добавить. Вам нужно будет вытащить их из dict, сохранить модель и установить их впоследствии.