我遵循了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])