python - 字段子类的子类没有新的迁移

标签 python django migration

我有以下设置(Django 2.0.6,也在 2.2 中),第一次迁移是使用具有 max_length=64 的字段,现在我想更改 DummyCharField.max_length 到 255:

class BaseDummyCharField(models.CharField):
    def __init__(self, *args, **kwargs):
        if 'max_length' not in kwargs:
            kwargs['max_length'] = 64
        super().__init__(*args, **kwargs)


class DummyCharField(BaseDummyCharField):
    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = 255
        super().__init__(*args, **kwargs)


class AnotherDummyCharField(BaseDummyCharField):
    ...


class DummyModel(models.Model):
    dummy = DummyCharField()

运行makemigrations时,它只是说“未检测到任何更改”。

我还尝试使用deconstruct(),如 docs 中所述。 ,但还是没成功。

class DummyCharField(BaseDummyCharField):
    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = 255
        super().__init__(*args, **kwargs)

    def deconstruct(self):
        name, path, args, kwargs = super().deconstruct()
        del kwargs['max_length']
        return name, path, args, kwargs

作为解决方法,我做了以下操作:

class DummyCharField(BaseDummyCharField):
    def __init__(self, *args, **kwargs):
        # If wrapped inside an `if`, it works...
        if 'max_length' not in kwargs:
            kwargs['max_length'] = 255
        ...

我在这里遗漏了什么吗?或者在这种情况下我到底犯了什么错?

最佳答案

1。简介

您以错误的方式使用了 __init__() 方法。

而Django的makemigrations命令,它分析我们所做的更改。在此过程中,它会调用__init__()方法来生成旧参数和新参数。 (此处,旧参数为 max_length=64,新参数为 max_length=256)

<小时/>

2。罪魁祸首?

__init__() 方法中的语句 kwargs['max_length'] = 255

模型字段max_length=255每次都会被初始化,这会导致覆盖。在检测模型更改时,此语句会导致无更改,因为您已将 max_length 设置为“CONSTANT”

<小时/>

3。解决方案?

只需在 __init__() 方法中放置一个 if.. 条件即可。

def __init__(self, *args, **kwargs):
    <b>if 'max_length'  not in kwargs:
        kwargs['max_length'] = 255</b>
<小时/>

4。最终代码片段

class DummyCharField(BaseDummyCharField):
    <b>def __init__(self, *args, **kwargs):
        kwargs.setdefault('max_length', 123)
        super().__init__(*args, **kwargs)</b>
<小时/>

5。引用资料--[源代码]

  1. makemigrations command module
  2. detecting any changes
  3. changes() MigrationAutoDetector 类的方法
  4. _detect_changes() MigrationAutoDetector 类的方法
  5. generate_altered_fields() MigrationAutoDetector 类的方法
  6. deep_deconstruct() MigrationAutoDetector 类的方法

关于python - 字段子类的子类没有新的迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56422003/

相关文章:

ruby-on-rails - 如何回滚到开始以及重新创建/重建新的迁移

mysql - 如何将数据库从 Postgres 迁移到 MySQL?

Python:如何遍历文件并用 "censored"替换诅咒词

python - matplotlib 中条形图的日期格式

django - Rest-auth 中的自定义用户模型 : RelatedObjectDoesNotExist

django - setUp 函数在 django TestCase 中被多次调用

mysql - 从 MySQL 切换到 Cassandra - 优点/缺点?

python - 从字符串中获取删除所有非字母数字字符的列表

python - 如何使用 Twisted Trial 对 Autobahn 应用程序进行单元测试?

python - 创建模型后如何运行方法?