【发布时间】:2018-03-21 13:20:45
【问题描述】:
我有这个模型文件,其中定义了自定义用户。
class CustomUser(AbstractBaseUser,PermissionsMixin, GuardianUserMixin):
email = models.EmailField(max_length=50,
verbose_name='email address', unique=True)
first_name = models.CharField('first name', max_length=15,blank=False)
last_name = models.CharField('last name', max_length=15,blank=True)
date_joined = models.DateTimeField('date joined', auto_now_add=True)
slug = models.SlugField('slug', max_length=50, unique=True, null=True)
is_active = models.BooleanField('active',default=True)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
class Meta:
app_label = "latiro_app"
db_table = "users"
permissions = (
("view_user", "view User"),
("edit_profile", "Edit Profile"),
)
def get_full_name(self):
full_name = '{0} {1}'.format(self.first_name, self.last_name)
return full_name.strip()
def get_short_name(self):
return self.first_name
def generate_user_slug(self):
max_length = CustomUser._meta.get_field('slug').max_length
full_name = self.get_full_name()
slug = original = slugify(full_name)[:max_length]
for i in itertools.count(1):
if not CustomUser.objects.filter(slug=slug).exists():
break
slug = '{0}-{1}' .format(original[:max_length - len(str(i)) - 1], i)
return slug
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self.generate_user_slug()
super().save()
def get_anonymous_user_instance(CustomUser):
return CustomUser(first_name='Anonymous')
class Profile (models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete= models.CASCADE,
null=False, verbose_name='list of users')
phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}')
phone_number = models.CharField('phone number', validators=[phone_regex], max_length=50, blank=True)
country = models.CharField(max_length=50,blank=True)
province = models.CharField(max_length=50)
city = models.CharField(max_length=50,blank=True)
profile_picture = models.ImageField(upload_to='user_profile/%y/%m/%d/', blank=True)
followers = models.IntegerField(default=0, null=True)
following = models.IntegerField(default=0, null=True)
还有这个信号
def create_user_profile(sender, instance, created, **kwargs):
if kwargs.get('created', True) and not kwargs.get('raw', False):
profile = Profile(user=instance)
profile.save()
post_save.connect(create_user_profile,
sender = settings.AUTH_USER_MODEL)
当运行第一次迁移时,Django 将我的应用程序很好地迁移到数据库中。但是当我第二次运行迁移时,Django 会抛出这个错误:
django.db.utils.IntegrityError: (1062, "Duplicate entry '' for key '电子邮件'”)。
我正在使用 MySQL。这里出了什么问题?
更新:当我进行第二次迁移时,我发现了引发错误的代码。
我的模型文件中有这段代码:
def get_anonymous_user_instance(CustomUser):
return CustomUser(first_name='Anonymous')
我将此功能导入到我的设置中,这样当我第一次进行迁移时,将创建匿名用户。并且它确实按预期进行。但是当我再次运行迁移时,django 尝试创建另一个匿名用户,这就是我收到此错误的原因。
当我在我的设置中注释掉这一行时:
" GUARDIAN_GET_INIT_ANONYMOUS_USER = 'latiro_app.models.get_anonymous_user_instance' "
我没有看到这个错误。
【问题讨论】:
-
显然您正在使用空的
email创建用户,并且由于它是唯一的,因此在添加第二个用户时会失败。如果没有更多关于如何创建用户的详细信息,很难说出它是如何发生的,尤其是在迁移中。 -
我正在使用 django abstractbaseuser 创建一个自定义用户,我在上面发布了我的代码
-
您发布了定义用户的代码,但没有发布您实际使用它的方式。您需要确保
email字段不为空。 -
原谅我,伙计,我的目的是在注册时使用我在上面发布的自定义用户模型创建一个用户,然后使用 Prpfile 模型类编辑用户配置文件与自定义用户类具有一对一的关系。
-
上面的代码有效,我可以创建用户和超级用户,但是当我想运行我的应用程序的第二次迁移时问题就来了。
标签: mysql django django-guardian