Django REST Framework无法将用户保存到AWS RDS PostgreSQL,无报错
Django连接AWS RDS PostgreSQL时用户创建失败但ID递增的问题
我有一个连接到AWS RDS PostgreSQL数据库的Django项目,创建普通用户时数据无法保存到数据库,但通过python manage.py createsuperuser命令能成功创建超级用户,且能在PGAdmin中正常查看。奇怪的是,尽管数据库里没有生成用户条目,但用户ID仍在持续递增。切换到SQLite数据库时功能正常,推测是AWS RDS PostgreSQL相关问题。
Settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': env("POSTGRES_NAME"), 'USER': env("POSTGRES_USER"), 'PASSWORD': env("POSTGRES_PASSWORD"), 'HOST': env("POSTGRES_HOST"), 'PORT': env("POSTGRES_PORT"), } } DATABASES["default"]["ATOMIC_REQUESTS"] = True
models.py
class UserManager(BaseUserManager): def _create_user(self, email, password,first_name,last_name,is_staff, is_superuser, **extra_fields): if not email: raise ValueError('Users must have an email address') now = timezone.now() email = self.normalize_email(email) user = self.model( email=email, is_staff=is_staff, is_active=True, is_superuser=is_superuser, last_login=now, date_joined=now, first_name = first_name, last_name = last_name, **extra_fields ) user.set_password(password) user.save(using=self._db) return user def create_user(self, email, password, first_name, last_name, **extra_fields): user = self._create_user(email, password, first_name, last_name, False, False, **extra_fields) user.save(using=self._db) return user # return self._create_user(email, password, first_name, last_name, False, False, **extra_fields) def create_superuser(self, email, password, **extra_fields): user=self._create_user(email, password, None, None, True, True, **extra_fields) user.save(using=self._db) return user # Custom user model class User(AbstractBaseUser, PermissionsMixin): email = models.EmailField(max_length=254, unique=True) name = models.CharField(max_length=254, null=True, blank=True) first_name = models.CharField(max_length=254, null=True, blank=True) last_name = models.CharField(max_length=254, null=True, blank=True) is_staff = models.BooleanField(default=False) is_superuser = models.BooleanField(default=False) is_active = models.BooleanField(default=True) last_login = models.DateTimeField(null=True, blank=True) date_joined = models.DateTimeField(auto_now_add=True)
serializer.py
class UserSerializer(ModelSerializer): class Meta: model = User fields = '__all__' extra_kwargs = { 'password': {'write_only': True}, 'id': {'read_only': True} } # called when we create a user def create(self, validated_data): password = validated_data.pop('password', None) # user itself instance = self.Meta.model(**validated_data) if password is not None: instance.set_password(password) instance.save() return instance
views.py
class RegisterAPIView(APIView): def post(self, request): data = request.data print("here data") print(data) if data['password'] != data['password_confirm']: raise exceptions.APIException('Passwords do not match!') serializer = UserSerializer(data=data) serializer.is_valid(raise_exception=True) user_id = serializer.save() # serializer.save() print('errors:', serializer.errors) return Response(serializer.data,status=status.HTTP_200_OK)
接口请求示例
{ "first_name": "firstName", "last_name": "lastName", "email": "user7@user.com", "password": "password123", "password_confirm": "password123" }
接口响应示例
{ "id": 15, "first_name": "firstName", "last_name": "lastName", "email": "user7@user.com", }
终端输出
here data {'first_name': 'firstName', 'last_name': 'lastName', 'email': 'user7@user.com', 'password': 'password123', 'password_confirm': 'password123'} errors: {}
内容的提问来源于stack exchange,提问作者justin107d
相关产品推荐
相关产品推荐

