0

我遵循了Django 用户配置文件中的一些步骤 - 简单而强大

不完全一样,因为我正在开发这个想法。从这个站点我特别使用了这一行:

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

我在创建对象时总是收到一条错误消息,通常“XX”可能不为空。我通过使用模型和(在我目前的情况下)sqliteman 解决了部分问题。直到我在 id 上收到相同的消息:“xxx.id 可能不为空”。

在网上,我找到了一个可能的解决方案的描述,其中涉及重置数据库,我不太乐意这样做。特别是因为对于不同的解决方案,它可能涉及应用程序数据库的重置。

但是因为 UserProfile 模型有点新而且到目前为止是空的,所以我直接在 DB 上使用它并手工制作了表并要求 syncdb 重建它。(有点冒险的想法)。

现在这是 sqlite 转储的差异:

294,298c290,294
< CREATE TABLE "myt_userdata" (
<     "id" integer NOT NULL PRIMARY KEY,
<     "user_id" integer NOT NULL UNIQUE REFERENCES "auth_user" ("id"),
<     "url" varchar(200),
<     "birthday" datetime
---
> CREATE TABLE myt_userdata (
>     "id" INTEGER NOT NULL,
>     "user_id" INTEGER NOT NULL,
>     "url" VARCHAR(200),
>     "birthday" DATETIME

请注意,这两个版本都是由 django 生成的。">" 版本是用一个简单的模型定义生成的,它确实通过以下方式与用户表连接:

user = models.ForeignKey(User, unique=True)

新的“<”版本包含更多信息并且正在运行。

我的问题:

为什么 Django 抱怨 myt_userdata.id 可能不为空?

附属问题:

Django 是否尝试与下划线数据库结构相关联,如何?(例如 not NULL 消息来自模型还是来自数据库?)

附加问题:

我一直不太愿意使用南:太复杂,额外的模块,我可能需要在开发和生产之间关心,如果我想切换数据库引擎,可能不是那么容易(我只在开发阶段使用 sqlite,我计划移动到mysql)。

在这种情况下,南方可能会奏效。它会起作用吗?你会建议使用它吗?

编辑 FIY:

这是我的最后一个模型(工作模型):

class UserData(models.Model):

    user = models.ForeignKey(User, unique=True)

    url = models.URLField("Website", blank=True, null=True)

    birthday = models.DateTimeField('Birthday', blank=True, null=True)

    def __unicode__(self):
        return self.user.username

User.profile = property(lambda u: UserData.objects.get_or_create(user=u,defaults={'birthday': '1970-01-01 00:00:00'})[0])
4

1 回答 1

1

为什么 Django 抱怨 myt_userdata.id 可能不为空?

因为id不是主键,但不会自动填充。此外,您没有在模型创建时提供它,因此 DB 不知道该怎么做。

Django 是否尝试与下划线数据库结构相关联,如何?(例如 not NULL 消息来自模型还是来自数据库?)

这是来自 DB 的错误,而不是来自 Django。

您可以使用sql 命令来了解在 syncdb 上究竟执行了什么。上面的变体似乎是由正确的 Django 模型制成的正确的表定义,我不知道你是如何得到下面的变体的。写一个正确清晰的模型,你就会得到正确的工作表方案syncdb

于 2012-05-16T00:03:38.427 回答