我有以下设置(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。引用资料--[源代码]
-
makemigrations
command module - detecting any changes
-
changes()
MigrationAutoDetector
类的方法 -
_detect_changes()
MigrationAutoDetector
类的方法 -
generate_altered_fields()
MigrationAutoDetector
类的方法 -
deep_deconstruct()
MigrationAutoDetector
类的方法
关于python - 字段子类的子类没有新的迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56422003/