0

ユーザーの作成時に 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 が同じエラーをスローします。一体何が起こっているのですか?

4

3 に答える 3

1

私自身の質問に答えました。ユーザーが作成および保存されると、UserProfile も作成/保存されます。これはわかっています。私が知らなかったのは、ここに記載されているように、日付、ブール値、および整数を null にすることはできないということです。したがって、解決策は UserProfile クラスの次の行を変更することです。

age = models.DateField()

age = models.DateField(null=True)

これにより、UserProfile をデータを入力せずに DB に保存することができ、get_profile() で取得して後でデータを入力することができます。

于 2012-06-15T22:39:30.933 に答える
0

AUTH_PROFILE_MODULE新しいユーザーが保存された後にユーザー プロファイルを自動的に作成するには、settings.pyに追加する必要があると思います。このドキュメントを確認しましたか?

于 2012-06-15T05:18:44.577 に答える
0

年齢が空でないかどうかを確認しましたか? ユーザープロファイルを介してユーザーを作成しないのはなぜですか? つまり、次のとおりです。

profile.first_name = 'abc'
profile.last_name = 'abc'
profile.age = Date(2000, 1, 1)
profile.save()
于 2012-06-15T04:49:44.530 に答える