python - ¿Por qué Django realiza migraciones para los cambios help_text y verbose_name?
database-migration django-1.7 (6)
Cuando cambio help_text
o verbose_name
para cualquiera de los campos de mi modelo y ejecuto las python manage.py makemigrations
, detecta estos cambios y crea una nueva migración, por ejemplo, 0002_xxxx.py
.
Estoy usando PostgreSQL y creo que estos cambios son irrelevantes para mi base de datos (me pregunto si existe un DBMS para el cual estos cambios sean relevantes).
¿Por qué Django genera migraciones para tales cambios? ¿Hay una opción para ignorarlos?
¿Puedo aplicar los cambios de 0002_xxxx.py
a la migración anterior ( 0001_initial.py
) de forma manual y segura para eliminar 0002_xxxx.py
?
¿Hay alguna manera de actualizar la migración previa automáticamente?
Como @ChillarAnand señaló, hay un ticket para resolver este problema, pero hasta ahora (django 1.9.1) los comandos de migración no se han corregido.
La forma menos intrusiva de solucionarlo es crear su propio comando maketranslatedmigrations
en <your-project>/management/commands/maketranslatedmigrations.py
como
#coding: utf-8
from django.core.management.base import BaseCommand
from django.core.management.commands.makemigrations import Command as MakeMigrations
class Command(MakeMigrations):
leave_locale_alone = True
can_import_settings = True
def handle(self, *app_labels, **options):
super(Command, self).handle(*app_labels, **options)
Y luego puede usarlo exactamente igual que las migraciones originales.
PD: No olvides agregar archivos __init__.py
cualquier lugar de la ruta.
El boleto que ChillarAnand menciona es muy útil, pero al final del registro de cambios, no me di cuenta de si se había corregido o no, o se había corregido en la versión más reciente de Django.
Entonces, debido a que no encontré ninguna solución para Django 1.9.13, agregué un pequeño truco a settings.py
:
if ''makemigrations'' in sys.argv:
USE_I18N = False
USE_L10N = False
No es elegante, pero funciona bien.
He escrito un módulo personalizado para ese propósito
Todo lo que necesita es guardarlo en algunos utils / models.db y en todos sus modelos en lugar de hacerlo from django.db import models
escribir from utils import models
Si alguien está interesado en él, puedo escribir un componente y publicarlo en pypi
UPD: prueba esto https://github.com/FeroxTL/django-migration-control
# models.py
# -*- coding: utf-8 -*-
from types import FunctionType
from django.db import models
class NoMigrateMixin(object):
"""
Позволяет исключить из миграций различные поля
"""
def deconstruct(self):
name, path, args, kwargs = super(NoMigrateMixin, self).deconstruct()
kwargs.pop(''help_text'', None)
kwargs.pop(''verbose_name'', None)
return name, path, args, kwargs
# =============================================================================
# DJANGO CLASSES
# =============================================================================
for name, cls in models.__dict__.items():
if isinstance(cls, type):
if issubclass(cls, models.Field):
# Поля
globals()[name] = type(name, (NoMigrateMixin, cls), {})
else:
# Всякие менеджеры
globals()[name] = cls
elif isinstance(cls, FunctionType):
# Прочие функции
globals()[name] = cls
Para evitar migraciones innecesarias puede hacer lo siguiente:
- Campo de subclase que causa migración
- Escribe el método de deconstrucción personalizado dentro de ese campo
- Lucro
Ejemplo:
from django.db import models
class CustomCharField(models.CharField): # or any other field
def deconstruct(self):
name, path, args, kwargs = super(CustomCharField, self).deconstruct()
# exclude all fields you dont want to cause migration, my example below:
if ''help_text'' in kwargs:
del kwargs[''help_text'']
if ''verbose_name'' in kwargs:
del kwargs[''verbose_name'']
return name, path, args, kwargs
Espero que ayude
Puedes aplastarlo con la migración anterior , claro.
O si no desea enviar esas migraciones en absoluto, puede anular el makemigrations
y migrate
al poner esto en management/commands/makemigrations.py
en su aplicación:
from django.core.management.commands.makemigrations import Command
from django.db import models
IGNORED_ATTRS = [''verbose_name'', ''help_text'', ''choices'']
original_deconstruct = models.Field.deconstruct
def new_deconstruct(self):
name, path, args, kwargs = original_deconstruct(self)
for attr in IGNORED_ATTRS:
kwargs.pop(attr, None)
return name, path, args, kwargs
models.Field.deconstruct = new_deconstruct
Este boleto abordó el problema.
Si ha cambiado solo help_text
& django genera una nueva migración; luego puede aplicar los cambios de la migración más reciente a la migración anterior y eliminar la migración más reciente.
Simplemente cambie help_text
en la migración anterior a help_text presente en la última migración y elimine el último archivo de migración. Asegúrese de eliminar el archivo *.pyc
correspondiente, si está presente. De lo contrario, se generará una excepción.