我有以下设置(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。罪魁祸首?你知道吗
语句,
kwargs['max_length'] = 255
在__init__()
方法中。每次都用
max_length=255
初始化模型字段,这导致了这里的覆盖。在检测模型更改时,此语句不会导致任何更改,因为已将max_length
设置为“常量”。你知道吗三。解决方案?你知道吗
只需在
__init__()
方法中放入一个if..
条件。你知道吗第四条。最终代码段
五。参考资料[源代码]
MigrationAutodetector
类的{a3}方法MigrationAutodetector
类的{a4}方法MigrationAutodetector
类的{a5}方法MigrationAutodetector
类的{a6}方法相关问题 更多 >
编程相关推荐