为什么Django会为help_text和verbose_name更改进行迁移?

uta*_*ngo 39 python django database-migration django-1.7 django-1.9

当我更改help_textverbose_name运行任何模型字段并运行时python manage.py makemigrations,它会检测到这些更改并创建新的迁移,例如0002_xxxx.py.

我正在使用PostgreSQL,我认为这些更改与我的数据库无关(我想知道这些更改是否存在相关的DBMS).

为什么Django会为此类更改生成迁移?有没有选择忽略它们?

我可以手动安全地删除0002_xxxx.py上次迁移(0001_initial.py)的更改0002_xxxx.py吗?

有没有办法自动更新以前的迁移?

Nic*_*ack 15

你肯定可以用之前的迁移压缩它.

或者,如果您根本不想输出这些迁移,可以通过将其放入应用程序来覆盖makemigrationsmigrate命令management/commands/makemigrations.py:

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
Run Code Online (Sandbox Code Playgroud)

  • 您可能也希望对 `migrate` 命令执行此操作,以避免出现“您的模型有尚未反映的更改”警告。我将 `new_deconstruct` 移到了 `__init__.py`,并在单独的文件中为这两个命令分配了 `models.Field.deconstruct = new_deconstruct`。 (3认同)
  • 感谢您指出这一点!事后看来是如此明显。对于某些人来说这是一个哲学问题(完整的迁移);这在理论上很好,但在实践中行不通。尤其是 help_text、选择和“存储”!我们的存储管理器和路径是在运行时确定的,所以...什么,你想让我为迁移创建一个假存储?嘎。这解决了它......将运行时问题与模型问题分开,就像它应该的那样。 (2认同)

Chi*_*and 9

这张票解决了这个问题.

如果您只更改了help_text&django会生成新的迁移; 然后,您可以将最新迁移的更改应用于以前的迁移,并删除最新的迁移.

只需help_text将先前迁移中的更改更改为最新迁移中存在的help_text,然后删除最新的迁移文件.确保删除相应的*.pyc 文件(如果存在).否则将引发异常.


小智 8

为避免不必要的迁移,您可以执行以下操作:

  1. 导致迁移的子类字段
  2. 在该字段内编写自定义解构方法
  3. 利润

例:

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
Run Code Online (Sandbox Code Playgroud)

希望有所帮助