我正在规范与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)
的内容,但是我会在哪里添加它?
答案 0 :(得分:0)
我做了类似的事情 - 将字段转换为属性并在那里处理警告。请注意,这仍然会破坏您对该字段进行过滤的任何查询 - 只是有助于从实例访问该属性。
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
答案 1 :(得分:0)
您可以使用django_deprication.DeprecatedField
pip install django-deprecation
然后像这样使用
class Album(models.Model):
name = DeprecatedField('title')
答案 2 :(得分:0)
也许您可以使用 Django 的 system check framework(在 Django 1.7 中引入)。
migrations docs 中提供了一些有趣的示例,使用系统检查框架来弃用自定义字段。
您似乎也可以使用这种方法在模型上标记标准字段。 应用于原始帖子中的示例,以下内容适用于我(在 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.
)
...
请参阅 system check API reference 了解更多详细信息,例如关于“唯一 ID”。
每当您调用 runserver
、migrate
或其他命令(如 in the docs)时,都会显示以下警告:
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 堆栈的一部分运行。 ...