【问题标题】:How is Django makemigrations triggered for changes to a custom model field?Django makemigrations 如何触发自定义模型字段的更改?
【发布时间】:2021-02-08 16:14:53
【问题描述】:

我有一个自定义模型字段定义为:

class PriceField(models.DecimalField):
    def __init__(self, *args, **kwargs):
        kwargs['max_digits'] = 30
        kwargs['decimal_places'] = 20
        super().__init__(*args, **kwargs)

我想更改它,使其也可以为空/可空白,所以我添加:

class PriceField(models.DecimalField):
    def __init__(self, *args, **kwargs):
        kwargs['max_digits'] = 30
        kwargs['decimal_places'] = 20
        kwargs['null'] = True
        kwargs['blank'] = True
        super().__init__(*args, **kwargs)

但是,在添加并运行 makemigrations 之后,不会创建新的迁移。阅读了https://docs.djangoproject.com/en/3.1/howto/custom-model-fields/#field-deconstruction 的文档后,我认为问题可能是缺少deconstruct() 方法,但即使添加了一个似乎在文档中描述的方法(我读为删除你覆盖的kwargs init 方法):

    def deconstruct(self):
        name, path, args, kwargs = super().deconstruct()
        del kwargs['max_digits']
        del kwargs['decimal_places']
        del kwargs['null']
        del kwargs['blank']
        return name, path, args, kwargs

...它仍然没有创建任何迁移以使该字段可为空/可空白。谁能告诉我我错过了什么?

【问题讨论】:

    标签: python django django-migrations


    【解决方案1】:

    尝试将 null 和空白参数传递给模型定义中的字段初始化,就像在任何其他标准 django 字段中一样

    【讨论】:

    • 创建迁移(如果我从自定义字段中删除默认值)并将成为我的备份计划,但我希望我能保持定义自定义类的假定优势,即我只需要在一个地方设置默认参数,而不是在所有使用此字段的地方。
    猜你喜欢
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2017-02-23
    • 2014-07-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多