gpt4 book ai didi

Django ForeignKey null=True 无法从列中删除 not null

转载 作者:行者123 更新时间:2023-12-01 01:06:49 25 4
gpt4 key购买 nike

问题:

这是我的类(class),有两个 ForeignKey s( 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 NULLdept_id 上没有 salary_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选项..

解决方案 ??

最佳答案

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

PS - 在 Django 的 future 版本(最有可能是 Django 1.7)中,迁移功能将直接集成到 Django 核心中,但在那之前,South 将不得不这样做。

关于Django ForeignKey null=True 无法从列中删除 not null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18111733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com