0

我在使用 django-registration 和信号时遇到了一些问题。基本设置是我有一个 django 1.4.3 设置,带有 django-south 和 django-registration(数据库是 SQLite 的价值)。

编辑:我稍微改变了这个问题,因为shell中的效果是一样的,所以注册不是原因(编辑是斜体)。

我有一个与 User 模型相关的模型,其方式如下:

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

当我在那里时,一切似乎都很好,如果我打印 ids(用于用户和个人资料),并且如果我在 2 之间来回移动,我会看到一些似乎正确的东西。

如果我禁用这部分代码并使用 shell 进行相同类型的初始化,我会得到相同的结果。

但在那之后,一切都错了。如果我打开一个shell并导入相关事项,我对每个X值都有以下内容

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

好像有点奇怪不是吗?

现在如果我去 sql shell

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 回答