将空值设置为True,但仍然违反非空约束
我想把sidebar_id的值设为null,但却遇到了IntegrityError错误:
IntegrityError at /admin/qa/howquestion/112/change/
null value in column "sidebar_id" violates not-null constraint
DETAIL: Failing row contains (112, <p>prettyprint a JSON file<br></p>, To pretty print a JSON file in Python, you can use the json m...).
这很奇怪,因为null已经设置为True了:
sidebar = models.ForeignKey(Sidebar, on_delete=models.SET_NULL, related_name='qa_sidebars',null=True, blank=True)
而且我也已经应用了迁移。
请注意,这个错误在开发环境中不会出现,因为那时连接的是SQLite3数据库。这个问题只在使用PostGreSQL的部署环境中发生。
我已经没有其他办法了。我查了很多东西,还是不明白这个问题。有没有人能帮帮我?
编辑 1:我刚检查了迁移文件,以确保迁移已经应用。这个文件显示迁移已经应用,我觉得:
# Generated by Django 3.2 on 2024-03-14 16:48
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('marketing', '0001_initial'),
('qa', '0022_howquestion_no_code'),
]
operations = [
migrations.AlterField(
model_name='howquestion',
name='sidebar',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='qa_sidebars', to='marketing.sidebar'),
),
]
~
编辑 2:
我运行了showmigrations
命令,发现上面的迁移旁边有个X:
qa
[X] 0023_alter_howquestion_sidebar
所以,那次迁移已经通过migrate应用了。
我还直接检查了数据库表,使用了\d qa_howquestion
,发现sidebar_id
的可空属性被设置为not null
。所以,Django显示这个迁移已经应用了,允许非空值,但显然情况并不是这样!这是怎么回事呢?
[1]: https://i.stack.imgur.com/v7UO7.png
1 个回答
-3
我在把一些Python脚本搬到Linux的时候遇到了个问题。那些脚本用了winapi来处理空值。在Windows系统中,如果你引入了winapi,就可以使用NULL这个值,但其实用0来表示空值通常要简单得多。如果id字段是自动递增的,你就得用0。