Как изменить данные перед вызовом .create в django rest - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть следующая модель

class User(models.Model):
    UserName = models.CharField(max_length=20)
    Password = models.CharField(max_length=255)
    RoleName = models.CharField(max_length=30)
    Email = models.EmailField(max_length=50)
    ApartmentName = models.CharField(max_length=50)
    UserId = models.BigAutoField(primary_key=True)

Я сохранил данные, вызвав это представление

class Register(generics.CreateAPIView):

    serializer_class = serializers.UserSerializer
    def get_queryset(self, *args, **kwargs):
        return models.User.objects.all()

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

Но перед созданием строки в таблице базы данных мне нужно изменитьпароль для хешированной формы, я не могу изменить переменные записи в запросе, поскольку он неизменен. Как хешировать пароль с помощью make_password перед сохранением данных?

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Если объекты User создаются только из вида Register, переопределить метод create для UserSerializer работает нормально.Однако пользователи, созданные другими способами (интерфейс администратора, форма django, команда управления и т. Д.), Не будут шифровать свои пароли, если вы не предоставите некоторый код для этого всеми этими способами.

Для хеширования пароляперед сохранением любого пользователя лучше всего создать сигнал pre_save или переопределить save метод User для хеширования пароля (сериализатор и представление не изменятся)

class User(models.Model):
    ...

    def save(self, **kwargs):
        self.password = make_password(self.password)
        return super(User, self).save(**kwargs)

Убедитесь, что пароль не существует или был изменен перед вызовом make_password, чтобы не кодировать уже закодированный пароль

0 голосов
/ 25 декабря 2018

Вы можете сделать это в классе сериализатора.

class UserSerializer(ModelSerializer):

    class Meta:
        model=User
        fields = ('Username', 'Password', #others)

   def create(self, validated_data):
       user = User()
       user.Username = validated_data['Username']
       user.Password = make_password(validated_data['Password'])
       # other

. 'Make_password' может быть любой функцией, которую вы хотите

Тогда на виду просто сохраните сериализатор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...