Django会创建无用的迁移吗?

Django会创建无用的迁移吗?,django,django-models,Django,Django Models,当我更改Django模型的verbose\u name属性时,Django将生成一个相关的迁移(运行make migrations命令) 但是,在不应用迁移(migrate命令)的情况下,更改似乎应用于整个Django项目。我认为这是因为verbose\u name是在Django级别而不是数据库级别使用的 这让我想知道:这个迁移文件的目的是什么?Django对使用的后端进行了抽象。实际上,通过更改settings.py文件,您可以使用不同的后端。事实上,您可以自己定义后端 因此,对模型的所有更

当我更改Django模型的
verbose\u name
属性时,Django将生成一个相关的迁移(运行
make migrations
命令)

但是,在不应用迁移(
migrate
命令)的情况下,更改似乎应用于整个Django项目。我认为这是因为
verbose\u name
是在Django级别而不是数据库级别使用的


这让我想知道:这个迁移文件的目的是什么?

Django对使用的后端进行了抽象。实际上,通过更改
settings.py
文件,您可以使用不同的后端。事实上,您可以自己定义后端

因此,对模型的所有更改都会对数据库产生影响。例如,您可以定义一个后端,该后端使用列的
verbose\u name
作为“注释字符串”,您可以经常在数据库端添加到该列中。例如,如果您定义了
选项
,那么对于某些数据库,后端可以尝试在数据库级别强制执行这些选项

正如前面所说,Django的目标是在不知道所使用的后端的情况下工作,因此它的目标是保持保守,并为许多模型更改进行迁移。对于其中一些,后端将决定什么也不做。因此,不会构造任何查询,也不会在数据库端进行任何更改。您确实可以看到这样的变化,即“无用的迁移”。但请记住,如果以后使用不同的后端,这些“无用的迁移”实际上可能会起到一些作用

由于这样的迁移在数据库端不起任何作用,因此通常不会占用时间。您可能希望同时查看,从而减少使用的迁移文件的数量。迁移仍然是文件的一部分,但由于不涉及任何查询,因此通常不会造成太大危害

此外,事实上,您可以在字段上修补
解构
函数,以便
帮助文本
等不再出现在
解构
调用的结果中,因此对“检测器”不可见。这显示了一种修补
makemigration
命令的方法:


Django确实有时会创建“无用”的迁移。这是因为某些后端可能会在数据库级别执行某些操作(如更改注释或定义选项),而大多数后端可能不会执行任何操作。@WillemVanOnsem谢谢,这是有道理的。我将尝试查看是否有办法配置Django以不创建这些迁移文件。是否可以提示Django字段的哪些属性不会影响我当前的后端,因此如果这些字段属性发生更改,它不应该创建迁移?类似于
exclude\u attributes=('choices','verbose\u name')
@radoh:你可以“猴子补丁”这个
destruct
:我想你可以制作一个包,用你描述的设置来实现这一点。所以从技术上讲这是可能的。
"""
Patch the creation of database migrations in Django
Import this early from `__init__.py``.
- Don't want verbose_name changes in the migrations file.
- Don't want help_text in the migrations file.
"""
from functools import wraps

from django.db.models import Field


def patch_deconstruct(old_func, condition):
    """
    Patch the ``Field.deconstruct`` to remove useless information.
    This only happens on internal apps, not third party apps.
    """

    @wraps(old_func)
    def new_deconstruct(self):
        name, path, args, kwargs = old_func(self)
        # AutoField has no model on creation, but can be skipped
        if hasattr(self, 'model') and condition(self):
            kwargs.pop('verbose_name', None)
            kwargs.pop('help_text', None)
        return name, path, args, kwargs
    return new_deconstruct


Field.deconstruct = patch_deconstruct(Field.deconstruct, lambda self: self.model.__module__.startswith('apps.'))