python - Django:唯一约束失败:user.username
问题描述
我在使用 Django 默认用户时遇到问题,from django.contrib.auth.models
但尝试将它与我的自定义用户模型一起使用,使用from django.contrib.auth.models import AbstractUser
.
所以这是我的用户模型:
from django.db import models
from django.contrib.auth.models import AbstractUser, UserManager as AbstractUserManager
# from django.conf import settings
from django_countries.fields import CountryField
# https://github.com/SmileyChris/django-countries
from django.db.models.signals import post_save
from django.dispatch import receiver
class UserManager(AbstractUserManager):
pass
class User(AbstractUser):
"""auth/login-related fields"""
is_a = models.BooleanField('a status', default=False)
is_o = models.BooleanField('o status', default=False)
def __str__(self):
return "{} {}".format(self.first_name, self.last_name)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
User.objects.set_password(instance.password)
这是我的个人资料模型:
from django.db import models
from django_countries.fields import CountryField # https://github.com/SmileyChris/django-countries
from django.contrib.auth import get_user_model
User = get_user_model()
# https://medium.com/swlh/best-practices-for-starting-a-django-project-with-the-right-user-model-290a09452b88
from django.db.models.signals import post_save
from django.dispatch import receiver
class Profile(models.Model):
"""non-auth-related/cosmetic fields"""
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='Profile')
birth_date = models.DateTimeField(auto_now=False, auto_now_add=False, null=True)
nationality = CountryField(null=True)
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES, null=True)
def __str__(self):
return f'{self.user.username} Profile'
"""receivers to add a Profile for newly created users"""
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
但在添加User.objects.set_password(instance.password)
到我的用户模型之前,我在 py shell 中完成了它,它运行良好。
但是现在我在我的用户模型中添加了这一行,当我使用 Postman 发布用户时:
{
"username":"1564",
"password":"12345678",
"first_name":"Al",
"last_name":"Pongvf",
"email":"ahgj@live.fr"
}
它给了我这个错误信息:
IntegrityError at /user/create/
UNIQUE constraint failed: ep_user.username
我不明白,因为我正在创建一个具有全新用户名的新用户。
我一直在寻找解决方案,但我没有幸运:
有谁知道我错过了什么?还是做错了?
谢谢!
更新:
这是我的User Serializer
:
from rest_framework import serializers
from django.contrib.auth import get_user_model
from ..models.model_user import *
# from .serializers_profile import *
class UserIndexSerializer(serializers.ModelSerializer):
# profile = ProfileIndexSerializer()
class Meta:
model = User
fields = [
'id',
'username',
'password',
'first_name',
'last_name',
'email',
'is_a',
'is_o'
# 'profile'
]
class UserCreateSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = [
'username',
'password',
'first_name',
'last_name',
'email',
'is_a',
'is_o'
]
class UserDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
这是我的User View
:
from rest_framework import generics
from django.contrib.auth import get_user_model
from ..models.model_user import *
from ..serializers.serializers_user import *
class UserIndex(generics.ListAPIView):
"""List all users, or create a new user."""
queryset = User.objects.all().order_by('id')
serializer_class = UserIndexSerializer
class UserCreate(generics.CreateAPIView):
"""List all art pieces, or create a new art piece."""
queryset = User.objects.all()
serializer_class = UserCreateSerializer
class UserDetails(generics.RetrieveUpdateDestroyAPIView):
"""Retrieve, update or delete a user instance."""
queryset = User.objects.all()
serializer_class = UserDetailsSerializer
我的admin.py
:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
# Register your models here.
from .models.model_user import *
from .models.model_profile import *
admin.site.register(User, UserAdmin)
admin.site.register(Profile)
解决方案
推荐阅读
- javascript - 如何根据下拉菜单更新数据源?
- reactjs - Gatsby/React:如何防止在更改 display:none 元素的背景图像时发生这种重绘?
- mysql - 如何使用 SQLAlchemy 加快批量插入 MySQL 的速度?
- python - 我正在尝试将桌面中存在的图像加载到 pygame 中,但它只是给了我一个错误
- python-3.x - 如何通过python仅获取值json文件文本
- date - Informix 中的 CURRENT 和 TODAY 有什么区别
- javascript - ReactJS 和 ChartJS - getElementAtEvent 在控制台中有效,但在代码中无效
- awk - 从鹈鹕迁徙到雨果
- python - 如何在 Python 3 中检查给定数字是否为阶乘
- node.js - 如何使用 POST 方法将在代码编辑器中编写的代码发送到服务器