我尝试保存用户的出生日期,但获取“列中的空值”dob“违反非空约束”错误。
models.py:
class Profile(models.Model):
user = models.OneToOneField(User, unique=True)
nickname = models.CharField(max_length=32)
dob = models.DateField(null=False)
sex = models.BooleanField(null=False)
这里我尝试生成随机用户:
def create_random_users(userCount=1000):
random.seed()
for i in range(0, userCount):
sex = random.randint(0, 1)
name = random.choice(names[sex])
email = "{0}{1}@mail.com".format(name, i)
user = soc_models.User.objects.create_user(email, email, password='password')
user.save()
userProfile = soc_models.Profile.objects.create()
userProfile.user = user
_year = random.randrange(1962, 1995)
_month = random.randrange(1, 12)
_day = random.randrange(1, calendar.monthrange(_year, _month)[1])
userProfile.dob = datetime.datetime(_year, _month, _day)
userProfile.sex = random.randrange(0, 1)
userProfile.city = random.randrange(4000000)
userProfile.country = random.randrange(230)
userProfile.save()
谢谢。
答案 0 :(得分:2)
create方法被记录为“创建对象并将其全部保存在一个步骤中的便捷方法”。因此,当您的示例数据创建脚本中的以下语句运行时:
userProfile = soc_models.Profile.objects.create()
它尝试将空Profile
对象保存到数据库。由于此时尚未设置dob
属性,因此会触发NOT NULL
约束。
避免这种情况的两种方法是:
create
的关键字参数为所有字段提供值。答案 1 :(得分:1)
使用create
时,必须将所有必需的值传递给它,如果您想稍后调用save()
,请使用模型构造函数,即:
userProfile = soc_models.Profile()
答案 2 :(得分:0)
我不确定它是否修复了您的错误,但对于文档,DateField
应该用于存储datetime.date
实例,而DateTimeField
用于存储datetime.datetime
}。
P.S。实际上,看起来您正在尝试“迁移”DB方案(以更改已创建的列)。 Django不支持此功能,但您可以使用外部应用程序,如South。