0

django-registration とシグナルの使用に少し問題があります。基本的なセットアップは、django-south と django-registration を備えた django 1.4.3 セットアップがあることです (そして、db は価値のある SQLite です)。

編集:シェルでも効果は同じであるため、質問を少し変更しました。登録は原因ではありません(編集は斜体で表示されています)。

次の方法で User モデルに関連するモデルの 1 つがあります。

class MyUserProfile(models.Model):
    user = models.OneToOneFiled(User)
    #additional fields

南を使用してベースを初期化しました。sqlallその中にあるはずのSQLを少し確認すると、次のことがはっきりとわかります。

CREATE TABLE "myApp_myuserprofile" (
    "id" integer NOT NULL PRIMARY KEY
    "user_id" integer NOT NULL UNIQUE REFERENCES "auth_user" ("id"),
    #other fields
)

その後、ユーザーがアカウントを有効化した場合にデータを初期化したいと考えました。だからmodels.pyに入れました

from django.dispatch import receiver
from registration.signals import user_activated
#Models....
@receiver(user_activated)
def createMyProfile(sender, **kwargs):
    currentUser = kwargs['user']
    profile = Profile(user = currentUser, #other fields default value)
    profile.save()
    #And now the reverse relation:
    currentUser.myuserprofile = profile
    currentUser.save()

私がそこにいる間、ID (ユーザーとプロファイルの両方) を印刷すると、すべて問題ないように見えます。2 の間を行ったり来たりすると、正しいと思われるものが表示されます。

コードのこの部分を無効にして、シェルを使用して同じ種類の初期化を行うと、同じ結果が得られます。

しかし、その後、すべてが間違っています。シェルを開いて関連事項をインポートすると、すべての X 値に対して次のようになります

MyUserProfile.objects.get(pk=X) 
#DoesNotExist Exception
User.objects.get(pk=X).myuserprofile.pk
1
MyUserProfile.objects.all()[X].pk
1

少し奇妙に思えませんか?

そして今、SQLシェルに行くと

select id from myApp_myuserprofile;
1
1
1
1
...

だから私はどこでも同じ値で満たされているプラ​​イマリ列を持っています。これはまあ... 控えめに言っても恥ずかしいことです (誰もが同じ ID のプロファイルを持っているため、問題が発生します)。

問題の原因と解決方法について何か考えはありますか?

PS: 関連リレーションからの外部キーは正しく、その一意性は保持されていることに注意してください。

4

1 に答える 1

0

問題は実際に SQLite と South の使用に起因していたようです。

ドキュメントには次のように記載されています。

SQLite はネイティブで多くのスキーマ変更をまったくサポートしていませんが、South には列の削除/変更を許可する回避策があります。ただし、一意のインデックスはまだサポートされていません。South はそのようなコマンドを黙って無視します。

最初からこの関係を作成したのではなく、後で移行したためです。ベースとマイグレーションをリセットしたところです。

Django South を使用して移行履歴をリセットするための推奨される方法は何ですか?を参照してください。移行./manage.py reset myApp用であり、基本リセット用の単純なものです。

于 2013-04-29T19:08:44.430 に答える