OneToOne字段对用户造成一些ID问题

时间:2013-04-22 20:56:01

标签: django django-south

使用django-registration和信号我有点问题。 基本的设置是我有一个django 1.4.3设置,django-south和django-registration(而db是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的个人资料)。

任何想法可能是问题的原因以及我如何解决它?

P.S:请注意,相关关系中的外键是正确的,并且保留了它们的唯一性。

1 个答案:

答案 0 :(得分:0)

看起来这个问题确实来自于使用SQLite和South。

doc表示:

  

SQLite本身并不支持很多模式更改,但是South有一些变通方法可以删除/更改列。但是,仍然不支持唯一索引;南方将默默地忽略任何此类命令。

这是(我认为)这种情况,因为我从一开始就没有创建这种关系,而是后来的迁移。我只是重置了基地和迁移和vo。

有关迁移的信息,请参见What's the recommended approach to resetting migration history using Django South?,基本重置请参见简单的./manage.py reset myApp