在我的models.py中,我想要一个外键的可选字段。我试过这个:
field = models.ForeignKey(MyModel, null=True, blank=True, default=None)
我收到此错误:
model.mymodel_id may not be NULL
我正在使用sqlite。如果它有用,这里是异常位置:
/usr/lib/python2.6/site-packages/django/db/backends/sqlite3/base.py in execute, line 200
答案 0 :(得分:6)
如果它之前不是null并且您在之前同步它,那么重新同步将不会更改它。删除表,使用South等迁移工具,或直接在SQL中更改列。
答案 1 :(得分:1)
我认为必须同时为null=True
和blank=True
。
答案 2 :(得分:0)
我不确定这个,但我认为你需要丢失“default = None”并执行reset / syncdb。默认值会覆盖null /空白信息。即如果你在管理员中给出一个空白,它将存储无(其表示可能因数据库而异)。我需要更仔细地查看代码/文档。
答案 3 :(得分:0)
我遇到了同样的问题,并深入到了表创建过程本身(因为在进行测试时也会出现问题。)
对于这样的模型:
class MyModel(models.Model):
owner = models.ForeignKey(User, null=True, blank=True)
生成的sql(./manage.py sql
)是:
CREATE TABLE `app_mymodel` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`owner_id` integer
)
ALTER TABLE `app_mymodel` ADD CONSTRAINT `owner_id_refs_id_34553282` FOREIGN KEY (`owner_id`) REFERENCES `auth_user` (`id`);
所以看起来表本身允许Null值,但DB级别的FK约束实际上是将值限制为实际的refences,所以没有NULL值......
这是Django中的错误吗?
编辑:事实证明,使用前一个命令创建的表将接受FK列中的NULL值,实际上在{F}列上有DEFAULT NULL
使用SHOW CREATE TABLE app_mymodel;
写出时的列规范。这很奇怪,但我现在无法复制错误。