17

スーパーユーザーがまだ既存のデータを持たない UserProfile に依存しているためだと思います。私のモデルは次のようになります

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save

class UserProfile(models.Model):
    user = models.OneToOneField(User) # required
    location = models.CharField(max_length=100)
    age = models.PositiveIntegerField(blank=True,null=True)
    contribution_points = models.PositiveIntegerField()
    #acheivements = models.ManyToMany()

def create_user_profile(sender,instance,created,**kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

ただし、次のエラーが発生します。

django.db.utils.DatabaseError: (1146, "Table 'savory_db.login_userprofile' doesn't exist")

走ったばかりなのにsyncdb

私のモデルには、このエラーの原因となる矛盾するフィールドがありますか? UserProfile をスーパーユーザーに適用すべきではありませんか? これを防ぐにはどうすればよいですか?

4

2 に答える 2

27

2011 年 3 月 23 日午前 4 時 25 分、マルコム ボックスは次のように書いています。

詳細な調査: South/syncdb の相互作用のようです。UserProfile は南への移行によって作成されますが、もちろん、auth post_install が実行されてスーパーユーザーのプロンプトが表示されたときには実行されていません。

悲しいことに、syncdb --migrate も正しいことをしません。

今のところ、./manage.py シェルを使用してスーパーユーザーを手動で作成しているだけですが、これをより適切に解決する方法についてのアイデアを歓迎します。

syncdb 中にスーパー ユーザーを作成しないでください。ユーザー プロファイル テーブルは存在しません。ユーザー プロファイルを作成する作成シグナルが管理者に必要です。これは失敗しているようです

データベースの初期化に使用する手順は次のとおりです。

python manage.py syncdb --noinput
python manage.py migrate
python manage.py createsuperuser

参考:https ://groups.google.com/forum/?fromgroups=#!topic/django-users/sBXllxrIdMc

于 2012-12-27T19:48:58.053 に答える
1

これとまったく同じ問題に遭遇しました-移行によって作成されたプロファイルモデルと、初期のを使用してスーパーユーザーが作成されるとシグナルハンドラーが壊れますsyncdb

私の解決策は次のとおりです。

まず、テーブルがまだ存在しない場合を処理します。これは少し醜く、おそらくあまりにも劇的です (他のエラーを覆い隠す可能性があります)。

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    try:
        WheelProfile.objects.get_or_create(user=instance)
    except DatabaseError:
        logging.error("Failed to create profile for %s, perhaps migrations haven't run yet?" % instance)
        from django.db import connection
        connection._rollback()

次に、移行が完了したらハンドラーを実行します。

from south.signals import post_migrate

@receiver(post_migrate)
def create_profiles(app, **kwargs):
    if app == "wheelcms_axle":
        for u in User.objects.all():
            WheelProfile.objects.get_or_create(user=u)

もちろん、これは将来の移行を行うときにも実行され、プロファイルを持っていないユーザーのプロファイルを作成します。私にとって、それは問題ではありません。

于 2013-11-16T15:59:40.697 に答える