0

ユーザーの生年月日を保存しようとしましたが、「列 "dob" の null 値が not-null 制約に違反しています」というエラーが表示されます。

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()

ありがとうございました。

4

3 に答える 3

2

createメソッドは、「オブジェクトを作成し、すべてを 1 ステップで保存するための便利なメソッド」として文書化されています。したがって、サンプル データ作成スクリプトで次のステートメントを実行すると、次のようになります。

userProfile = soc_models.Profile.objects.create()

Profile空のオブジェクトをデータベースに保存しようとします。dobこの時点では属性を設定していないため、NOT NULL制約をトリガーします。

これを回避するには、次の 2 つの方法があります。

  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.dateDateTimeFielddatetime.datetime

PS実際には、DBスキームを「移行」しようとしているように見えます(すでに作成されている列を変更するため)。Djangoはそのような機能をサポートしていませんが、Southなどの外部アプリケーションを使用できます。

于 2012-08-30T07:00:15.210 に答える