我定义了额外的UserProfile
以将User
的属性扩展为
class UserProfile(models.Model):
SEX = (
(1, 'male'),
(0, 'woman'),
)
user = models.OneToOneField(User, on_delete=models.CASCADE)
sex = models.IntegerField(choices=SEX, default=1)
location = models.CharField(max_length=30)
about_me = models.TextField()
当我将UserProfile附加到Django shell中的现有用户
时In[19]: for u in User.objects.all():
...: profile = UserProfile(user=u)
...: profile.save()
报告错误:
IntegrityError: UNIQUE constraint failed: user_userprofile.user_id
我检查了答案Django: Integrity error UNIQUE constraint failed: user_profile.user_id - Stack Overflow,但没有想法解决我的问题。
答案 0 :(得分:1)
OneToOneField
表示每个User
只能有一个UserProfile
。由于您将循环遍历每个User
,因此它将失败 - 即违反定义OneToOneField
的唯一数据库约束 - 如果存在任何UserProfiles
。
检查这一点的简单方法是查看UserProfile.objects.count()
。如果答案不是0
,那么根据定义,当您运行循环时,您将获得IntegrityError
。
答案 1 :(得分:1)
这非常简单,您在OneToOne
和User
之间定义了UserProfile
关系,这意味着只有一个User
与一个且只有一个相关联 UserProfile
。
我不确定你的逻辑,不管怎么试试以下
for user in User.objects.all():
if hasattr(user,'userprofile') and not user.userprofile:
UserProfile.objects.create(user=user)
答案 2 :(得分:1)
我喜欢Jerin Peter George的答案,因为它不会对数据库产生影响,但是,如果您在迭代完成此过程时需要访问用户配置文件实例,您还可以使用绑定到该过程的内置get_or_create方法模特的经理。 。即
for u in User.objects.all():
instance, created = UserProfile.objects.get_or_create(
user=u,
defaults={#list of default keys and values})
if created:
#update profile with form or other external data?
else:
#do other stuff
instance.save()
您还可以检查查询集的计数
user_profiles = UserProfile.objects.filter(user=u)
instance = None
if user_profiles.count() is 0:
# user profile doesn't exist create one
instance = UserProfile.objects.create(user=u)
else:
# user profile exists
instance = user_profiles[0]