django'列中的空值'

时间:2012-08-30 06:56:50

标签: python django postgresql

我尝试保存用户的出生日期,但获取“列中的空值”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()

谢谢。

3 个答案:

答案 0 :(得分:2)

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

userProfile = soc_models.Profile.objects.create()

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

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

  1. 通过构造函数创建对象,以便它不会立即保存到数据库中。
  2. 通过create的关键字参数为所有字段提供值。

答案 1 :(得分:1)

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

userProfile = soc_models.Profile()

答案 2 :(得分:0)

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

P.S。实际上,看起来您正在尝试“迁移”DB方案(以更改已创建的列)。 Django不支持此功能,但您可以使用外部应用程序,如South