4

问题:

这是我的课程,有两个ForeignKeys (deptsalary_range)。注意null=True

class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name='user_profile')
    avatar = models.CharField(max_length=300, default='/static/default.png')
    dept = models.ForeignKey(Department, null=True)
    salary_range = models.ForeignKey(SalaryRange, null=True)

运行python manage.py sqlall main似乎显示了正确的 sql(没有NOT NULLondept_idsalary_range_id

CREATE TABLE "main_userprofile" (
    "id" integer NOT NULL PRIMARY KEY,
    "user_id" integer NOT NULL UNIQUE REFERENCES "auth_user" ("id"),
    "avatar" varchar(300) NOT NULL,
    "dept_id" integer REFERENCES "main_department" ("id"),
    "salary_range_id" integer REFERENCES "main_salaryrange" ("id"),

但是IntegrityError在创建时会发生UserProfile

main_userprofile.dept_id may not be NULL

并且在检查数据库后,两列都设置了NOT NULL如何?为什么?

黑客:

我所能想到的就是在之后改变表格syncdb

ALTER TABLE main_userprofile ALTER COLUMN dept_id DROP NOT NULL;
ALTER TABLE main_userprofile ALTER COLUMN salary_range_id DROP NOT NULL;

这适用于 Postgres,但 sqlite 没有ALTER COLUMN选项..

解决方案 ??

4

1 回答 1

4

一切似乎都很好。正如评论中所建议的那样,很可能在您第一次运行syncdb时,当时您没有和的选项null=True。然后您更改了代码,但没有修改表定义。要解决这个问题,您可以通过删除部件手动修复问题,也可以使用数据库迁移应用程序。最受欢迎的是迄今为止南部。South 可以检测模型定义中的更改并将适当的更改应用于您的数据库(称为数据库迁移)而不会丢失任何数据。South docs 非常好,因此您应该可以立即开始使用它。deptsalary_rangeNOT NULL

PS - 在 Django 的未来版本(很可能是 Django 1.7)中,迁移功能将直接集成到 Django 核心中,但在那之前,South 必须这样做。

于 2013-08-07T19:26:49.407 回答