修改 max_length 时 Django alterField 不保留 NOT NULL

Posted

技术标签:

【中文标题】修改 max_length 时 Django alterField 不保留 NOT NULL【英文标题】:Django alterField does not preserve NOT NULL when modifying max_length 【发布时间】:2015-07-25 07:46:48 【问题描述】:

我正在编写 django 迁移以将以下模型中 CharField 上的 max_length 从 200 更改为 255,但这样做会将这些字段从不可为空更改为可空。我希望这些字段保持不可为空。

有了sqlmigrate,我可以看到django为每次迁移运行的sql:

模型定义

# -*- coding: utf-8 -*-

from django.db import models


class Account(models.Model):
    # Would be added by Django default anyways.
    id = models.AutoField(primary_key=True)

    name = models.CharField(max_length=200)
    email = models.EmailField(max_length=200)
    password = models.CharField(max_length=200)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    last_seen_at = models.DateTimeField(auto_now_add=True)

    project_token = models.CharField(max_length=200)
    url = models.URLField(max_length=200)
    notification_emails = models.TextField(blank=True)

初始迁移0001

    BEGIN;
    CREATE TABLE `pnmodels_account` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(200) NOT NULL, `email` varchar(200) NOT NULL, `password` varchar(200) NOT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, `last_seen_at` datetime NOT NULL, `project_token` varchar(200) NOT NULL, `url` varchar(200) NOT NULL, `notification_emails` longtext NOT NULL);

    COMMIT;

迁移 0002 以将 max_length 更新为 255

    BEGIN;
    ALTER TABLE `pnmodels_account` MODIFY `email` varchar(255);
    ALTER TABLE `pnmodels_account` MODIFY `name` varchar(255);
    ALTER TABLE `pnmodels_account` MODIFY `password` varchar(255);
    ALTER TABLE `pnmodels_account` MODIFY `project_token` varchar(255);
    ALTER TABLE `pnmodels_account` MODIFY `url` varchar(255);

    COMMIT;

我认为 0002 中的 MODIFYs 需要包含 NOT NULL。这是一个 django 错误还是我错过了什么?

使用:Django==1.7.7,mysqlclient==1.3.6

【问题讨论】:

【参考方案1】:

这是一个已知问题,请参阅https://code.djangoproject.com/ticket/24595

等待修复,您可能需要“手动”完成,或者使您的列可以为空,然后不可为空

【讨论】:

+1。我也无法让“使您的列可以为空,然后不可为空”的方法起作用。我假设您的意思是在迁移 0002 上设置空白=真,在迁移 0003 上设置空白=假——生成的 sql 仍然不包含 NOT NULL。 该修复包含在 django 1.8.1 和 1.7.8 中。将是迁移

以上是关于修改 max_length 时 Django alterField 不保留 NOT NULL的主要内容,如果未能解决你的问题,请参考以下文章

我的Django模型中只有一个主键,但是它显示为多个主键时出错

一个字符行的 Django max_length 值

django admin中文输入编码错误

在 Django 中聚合分组字段时返回对象

Django 练习班级管理系统五 -- 查看老师列表

Django中'max_length'的最大尺寸是多少?