将空值设置为True,但仍然违反非空约束

1 投票
1 回答
72 浏览
提问于 2025-04-14 16:01

我想把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。

撰写回答