Django在创建用户时给我一个完整性错误。来自我的models.py:
class UserProfile(models.Model):
user = models.OneToOneField(User)
age = models.DateField()
city = models.CharField(max_length=30)
state = models.CharField(max_length=20)
country = models.CharField(max_length=30)
primary_language = models.CharField(max_length=30)
secondary_language = models.CharField(max_length=30, blank=True, null=True)
tertiary_language = models.CharField(max_length=30, blank=True, null=True)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
post_save.connect(create_user_profile, sender=User)
以上代码直接来自Django site。在views.py上,我创建用户:
def create_user_and_profile(request):
form = RegistrationForm(request.POST)
if form.is_valid():
# User is saved to DB here
user = User.objects.create_user(
username = form.cleaned_data['username'],
password = form.cleaned_data['password1'],
email = form.cleaned_data['email']
)
user.first_name = form.cleaned_data['first_name']
user.last_name = form.cleaned_data['last_name']
user.save()
# TODO remaining user creation code goes here
profile = user.get_profile()
profile.age = form.cleaned_data['age'],
profile.city = form.cleaned_data['city'],
profile.state = form.cleaned_data['state'],
profile.country = form.cleaned_data['country'],
profile.primary_language = form.cleaned_data['primary_language'],
profile.secondary_language = form.cleaned_data['secondary_language'],
profile.tertiary_language = form.cleaned_data['tertiary_language']
profile.save()
return user
else:
variables = RequestContext(request, {'form': form})
return render_to_response('registration/register.html', variables)
Django将创建用户对象(作为User.objects.create_user的结果),然后爆炸。我甚至在导入我的模型文件后在shell中尝试了这个 - 仍然炸毁。这是抛出的错误:
/ my_url /
中的IntegrityErrormyApp_userprofile.age可能不是NULL
我想到的是,当Django保存用户对象时,由于回调,它也创建了UserProfile obj。由于它没有用于创建UserProfile的数据,因此尝试创建一个以NULL为输入的数据库记录时会抛出完整性错误。
披露:我正在使用sqlite3并且已经多次删除和添加了表,因为我已经改进了我的模式。但是,正如我所知,数据库是正确的 - 我手动浏览了每个表格。
我找不到其他任何地方发生这种情况的例子。为什么Django会给我创建一个违反DB约束的UserProfile的选项?在过去的两天里,我一直把头发拉过来,非常感谢任何见解。谢谢!
编辑:刚刚删除数据库以便从头开始。 syncdb在创建超级用户帐户时抛出SAME ERROR。到底是怎么回事?
答案 0 :(得分:1)
回答了我自己的问题。创建用户时&保存,UserProfile也被创建/保存 - 我们知道。我不知道的是Dates,Booleans和整数不能如所述here那样为空。因此,解决方案是更改UserProfile类的这一行:
age = models.DateField()
到
age = models.DateField(null=True)
这允许将UserProfile保存到数据库而不进行填充,并允许我使用get_profile()检索它并稍后填充它。
答案 1 :(得分:0)
您是否检查过年龄是否为空? 为什么不通过userprofile创建用户?我的意思是:
profile.first_name = 'abc'
profile.last_name = 'abc'
profile.age = Date(2000, 1, 1)
profile.save()
答案 2 :(得分:0)
我认为您必须向settings.py添加AUTH_PROFILE_MODULE
,以便在保存新用户后自动创建用户个人资料。您检查了this文档吗?