ユーザーの作成時に Django から整合性エラーが発生します。私のmodels.pyから:
class UserProfile(models.Model):
user = models.OneToOneField(User)
age = models.DateField()
city = models.CharField(max_length=30)
state = models.CharField(max_length=20)
country = models.CharField(max_length=30)
primary_language = models.CharField(max_length=30)
secondary_language = models.CharField(max_length=30, blank=True, null=True)
tertiary_language = models.CharField(max_length=30, blank=True, null=True)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
post_save.connect(create_user_profile, sender=User)
上記のコードは、Djangoサイトから直接引用したものです。ユーザーを作成する views.py に移動します。
def create_user_and_profile(request):
form = RegistrationForm(request.POST)
if form.is_valid():
# User is saved to DB here
user = User.objects.create_user(
username = form.cleaned_data['username'],
password = form.cleaned_data['password1'],
email = form.cleaned_data['email']
)
user.first_name = form.cleaned_data['first_name']
user.last_name = form.cleaned_data['last_name']
user.save()
# TODO remaining user creation code goes here
profile = user.get_profile()
profile.age = form.cleaned_data['age'],
profile.city = form.cleaned_data['city'],
profile.state = form.cleaned_data['state'],
profile.country = form.cleaned_data['country'],
profile.primary_language = form.cleaned_data['primary_language'],
profile.secondary_language = form.cleaned_data['secondary_language'],
profile.tertiary_language = form.cleaned_data['tertiary_language']
profile.save()
return user
else:
variables = RequestContext(request, {'form': form})
return render_to_response('registration/register.html', variables)
Django は (User.objects.create_user の結果として) ユーザー オブジェクトを作成し、爆発します。モデルファイルをインポートした後、シェルでこれを試してみましたが、それでも失敗します。スローされているエラーは次のとおりです。
/my_url/ の IntegrityError
myApp_userprofile.age を NULL にすることはできません
私が考えているのは、Djangoがユーザーオブジェクトを保存するときに、コールバックのために UserProfile objも作成したことです。UserProfile を作成するためのデータがないため、NULL を入力としてデータベース レコードを作成しようとすると、整合性エラーがスローされます。
開示:私はsqlite3を使用しており、スキーマを改良したため、テーブルを複数回削除および追加しました。ただし、私が知る限り、DB は正しいです。各テーブルを手作業で調べました。
これが他の場所で発生している例は1つもありません。Django が、作成時に DB の制約に違反する UserProfile を作成するオプションを提供するのはなぜですか? 私は過去 2 日間、これについて頭を悩ませてきました。ありがとう!
編集:ゼロから始めるためにDBを削除しました。スーパーユーザー アカウントの作成時に syncdb が同じエラーをスローします。一体何が起こっているのですか?