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

2024-09-28 05:18:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下设置(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
        ...

我是不是漏掉了什么,或者我的错到底是什么?你知道吗


Tags: selfifinitmodelsdefnotargslength
1条回答
网友
1楼 · 发布于 2024-09-28 05:18:38

1。简介

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

Django的makemigrations命令分析了我们所做的改变。在这个过程中,它调用__init__()方法来生成旧参数和新参数。(这里,旧参数是max_length=64,新参数是max_length=256


2。罪魁祸首?你知道吗

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

每次都用max_length=255初始化模型字段,这导致了这里的覆盖。在检测模型更改时,此语句不会导致任何更改,因为已将max_length设置为“常量”。你知道吗


三。解决方案?你知道吗

只需在__init__()方法中放入一个if..条件。你知道吗

def __init__(self, *args, **kwargs):
    if 'max_length'  not in kwargs:
        kwargs['max_length'] = 255

第四条。最终代码段

class DummyCharField(BaseDummyCharField):
    def __init__(self, *args, **kwargs):
        kwargs.setdefault('max_length', 123)
        super().__init__(*args, **kwargs)

五。参考资料[源代码]

  1. ^{} command module
  2. detecting any changes
  3. ^MigrationAutodetector类的{a3}方法
  4. ^MigrationAutodetector类的{a4}方法
  5. ^MigrationAutodetector类的{a5}方法
  6. ^MigrationAutodetector类的{a6}方法

相关问题 更多 >

    热门问题