Django模型中的贬值字段



我正在将与Django项目关联的数据库进行标准化,并将将字段移至不同表。作为实施过程的一部分,如果在我实际删除列之前添加新表之后,我想向同事提出折衷警告。

class Asset(Model):
    model = models.CharField(max_length=64, blank=True, null=True)
    part_number = models.CharField(max_length=32, blank=True, null=True) # this will be a redundant column to be deprecated
    company = models.ForeignKey('Company', models.CASCADE, blank=True, null=True) # this will be a redundant column to be deprecated
    # other database fields as attributes and class methods

我的理解是,我需要在班上某个地方的warnings.warn('<field name> is deprecated', DeprecationWarning)线上添加一些东西,但是我在哪里添加?

也许您可以使用Django的系统检查框架(在Django 1.7中引入(。

在迁移文档中提供了一些有趣的示例,使用系统检查框架 custom 字段的弃用。

看来,您也可以使用此方法在模型上标记标准字段。适用于原始帖子的示例,以下作品适合我(在Django 3.1.6中进行了测试(。

class Asset(Model):
    ...
    company = models.ForeignKey('Company', models.CASCADE, blank=True, null=True)  
    company.system_check_deprecated_details = dict(
        msg='The Asset.company field has been deprecated.',
        hint='Use OtherModel.other_field instead.',
        id='fields.W900',  # pick a unique ID for your field.
    )
    ...

有关更多详细信息,例如,请参见系统检查API参考,例如关于"唯一id"。

如文档中所述,每当您致电runservermigrate或其他命令时,以下警告将显示:

System check identified some issues:
WARNINGS:
myapp.Asset.company: (fields.W900) The Asset.company field has been deprecated.
    HINT: Use OtherModel.other_field instead.

也很高兴知道(来自文档(:

...出于绩效原因,检查不是作为部署中使用的WSGI堆栈的一部分运行的。...

您可以使用django_deprication.DeprecatedField

pip install django-deprecation

然后像这样使用

class Album(models.Model):
    name = DeprecatedField('title')

https://github.com/openbox/django-deprecation

我做类似的事情 - 将字段变成属性并处理此处的警告。请注意,这仍然会打破您在现场上进行过滤器的所有查询 - 只需帮助从实例访问属性。

class NewAsset(Model):
    model = models.CharField(max_length=64, blank=True, null=True)
class Asset(Model):
    @property
    def model(self):
        log.warning('Stop using this')
        return NewAsset.model

相关内容

  • 没有找到相关文章

最新更新