0

我尝试保存用户的出生日期,但得到“列“dob”中的空值违反非空约束”错误。

模型.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()

谢谢你。

4

3 回答 3

2

create方法被记录为“一种创建对象并将其全部保存的便捷方法”。因此,当示例数据创建脚本中的以下语句运行时:

userProfile = soc_models.Profile.objects.create()

它试图将一个空Profile对象保存到数据库中。由于此时您尚未设置dob属性,因此您触发了NOT NULL约束。

避免这种情况的两种方法是:

  1. 通过构造函数创建对象,以便它不会立即保存到数据库中。
  2. 通过关键字参数为所有字段提供值create
于 2012-08-30T07:10:57.243 回答
1

使用时create,您必须将所有必需的值传递给它,如果您想save()稍后调用,请改用模型构造函数,即:

userProfile = soc_models.Profile()
于 2012-08-30T07:15:02.440 回答
0

我不确定它是否修复了您的错误,但关于文档,DateField应该用于存储datetime.date实例,并DateTimeField存储datetime.datetime.

PS真的,看起来您正在尝试“迁移”数据库方案(以更改已创建的列)。Django 不支持此类功能,但您可以使用外部应用程序,例如South

于 2012-08-30T07:00:15.210 回答