【问题标题】:OneToOne Fields on users causing some ID problems用户上的 OneToOne 字段导致一些 ID 问题
【发布时间】:2013-04-22 20:56:00
【问题描述】:

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

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

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

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:请注意,相关关系中的外键是正确的,并且保留了它们的唯一性。

【问题讨论】:

    标签: django django-south


    【解决方案1】:

    看起来问题确实来自 SQLite 和 South 的使用。

    doc 声明:

    SQLite 本身根本不支持太多的模式更改,但 South 提供了允许删除/更改列的解决方法。但是,仍然不支持唯一索引; South 会默默地忽略任何此类命令。

    (我认为)情况是这样,因为我没有从一开始就创建这种关系,而是通过后一种迁移。我刚刚重置了基础和迁移,瞧。

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

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 2019-03-16
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      相关资源
      最近更新 更多