用django选配外键?

时间:2010-09-08 00:35:20

标签: django sqlite foreign-keys optional

在我的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

4 个答案:

答案 0 :(得分:6)

如果它之前不是null并且您在之前同步它,那么重新同步将不会更改它。删除表,使用South等迁移工具,或直接在SQL中更改列。

答案 1 :(得分:1)

我认为必须同时为null=Trueblank=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;写出时的列规范。这很奇怪,但我现在无法复制错误。