25👍
You can squash it with the previous migration, sure.
Or if you don’t want to output those migrations at all, you can override the makemigrations
and migrate
command by putting this in management/commands/makemigrations.py
in your app:
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
15👍
This ticket addressed the problem.
If you have changed only help_text
& django generates a new migration; then you can apply changes from latest migration to previous migration and delete the latest migration.
Just change the help_text
in the previous migration to help_text present in latest migration and delete the latest migration file. Make sure to remove corresponding *.pyc
file if it is present. Otherwise an exception will be raised.
- [Django]-Giving email account a name when sending emails with Django through Google Apps
- [Django]-Django 1.5b1: executing django-admin.py causes "No module named settings" error
- [Django]-How do I run tests for all my Django apps only?
9👍
To avoid unnecessary migrations You can do as follows:
- Subclass field that causes migration
- Write custom deconstruct method inside that field
- Profit
Example:
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
Hope that helps
- [Django]-Django staticfiles not found on Heroku (with whitenoise)
- [Django]-Serving dynamically generated ZIP archives in Django
- [Django]-Login Page by using django forms
2👍
As @ChillarAnand noted there is a ticket solving this issue but until now (django 1.9.1) the migrations commands were not fixed.
The least intrusive way of fixing it is to create your own maketranslatedmigrations
command in <your-project>/management/commands/maketranslatedmigrations.py
as
#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)
And then you can use it exactly the same as original makemigrations.
P.S. Don’t forget to add __init__.py
files everywhere on the path
- [Django]-Virtualenv and source version control
- [Django]-Remove pk field from django serialized objects
- [Django]-Consolidating multiple post_save signals with one receiver
1👍
I have written custom module for that purpose
All you need is to save it in some utils/models.db and in all your models instead of from django.db import models
write from utils import models
If somebody is interested in it I can write a component and publish it on pypi
UPD: try this 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
- [Django]-How to access Django's field.choices?
- [Django]-Django-admin.py makemessages not working
- [Django]-How to see details of Django errors with Gunicorn?
1👍
The ticket that ChillarAnand mentions is very helpfull, but at final of changelog, I did not realize if it was fixed or not, or it was fixed in newest version of Django.
So, due to I did not found any solution for Django 1.9.13, I added a little hack to settings.py
:
if 'makemigrations' in sys.argv:
USE_I18N = False
USE_L10N = False
Not elegant, but it works ok.
- [Django]-Django model blank=False does not work?
- [Django]-How do I create sub-applications in Django?
- [Django]-Retrieving parameters from a URL
1👍
Stop to generate migrations files when changes verbose_name or verbose_name_plural in any of your model fields.
In a new file like src/monkey_patching/django/db/migrations/operations/change_model_options.py add this:
from django.db.migrations.operations import models
models.AlterModelOptions.ALTER_OPTION_KEYS = [
"base_manager_name",
"default_manager_name",
"get_latest_by",
"managed",
"ordering",
"permissions",
"default_permissions",
"select_on_save",
# "verbose_name",
# "verbose_name_plural",
]
Tested in django 1.11.10.
- [Django]-How to automatically run tests when there's any change in my project (Django)?
- [Django]-How to validate an Email address in Django?
- [Django]-Django: change the value of a field for all objects in a queryset
- [Django]-Nginx uwsgi (104: Connection reset by peer) while reading response header from upstream
- [Django]-How to get URL of current page, including parameters, in a template?
- [Django]-Where to put Django startup code?