Django alterField не сохраняет NOT NULL при изменении max_length

Я пишу миграцию django, чтобы изменить max_length в CharField в следующей модели с 200 на 255, но при этом эти поля изменяются с необнуляемых на обнуляемые. Я хочу, чтобы эти поля оставались необнуляемыми.

С sqlmigrate я вижу sql, который django запускает для каждой миграции:

Определение модели

# -*- 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;

Я думаю, что MODIFYs в 0002 должны включать NOT NULL. Это ошибка django или я что-то упустил?

Использование: Django==1.7.7, mysqlclient==1.3.6


person danpaz    schedule 13.05.2015    source источник


Ответы (1)


Это известная проблема, см. https://code.djangoproject.com/ticket/24595.

В ожидании исправления вам может потребоваться сделать это «вручную» или сделать столбец обнуляемым, а затем не обнуляемым.

person Sylvain Biehler    schedule 13.05.2015
comment
+1. Я не мог заставить ваш столбец обнуляться, а затем не обнуляемый подход к работе. Я предполагаю, что вы имели в виду установить пустое = True при миграции 0002 и пустое = False при миграции 0003 - сгенерированный sql все еще не включал NOT NULL. - person danpaz; 14.05.2015
comment
Исправление включено в django 1.8.1 и 1.7.8. Было бы мигрировать - person Sylvain Biehler; 14.05.2015