python - Django 从所有查询中排除字段
问题描述
我在 Heroku 上运行具有零停机时间功能的 Django。这意味着在部署期间,同一数据库上运行了两个版本的代码(旧的和新的)。这就是为什么我们需要避免任何向后不兼容的迁移。
是否有可能从给定模型的 Django 查询中排除字段?
假设我们有一个模型(版本 1):
class Person(models.Model):
name = models.CharField()
address = models.TextField()
在将来的某个时间,我们希望将地址移动到单独的表中。我们知道我们不应该删除一个字段以使旧代码正常工作,因此 Person 模型可能看起来像(版本 2):
class Person(models.Model):
name = models.CharField()
address = models.ForeignKey(Address)
_address = models.TextField(db_name='address')
这样,如果旧代码将查询地址,即使数据库已迁移,它也会从 Person 表中获取地址(这将是一个旧值,但假设这不是一个大问题)。
现在我如何安全地删除_address
字段?如果我们将部署版本 3 并_address
删除字段,那么版本 2 的代码仍将尝试_address
在选择时获取,即使它没有在任何地方使用并且会因“没有此类列”异常而失败。
有没有办法防止这种情况并在版本 2 的代码中将某些字段标记为“不可获取”?所以版本 2 不会删除字段,但不会再获取它,版本 3 将删除字段。
解决方案
defer
您可以为所有查询集的特定字段/字段使用自定义对象管理器。
class CustomManager(models.Manager):
def get_queryset(self):
return super(CustomManager, self).get_queryset().defer('_address',)
class Person(models.Model):
name = models.CharField()
address = models.ForeignKey(Address)
_address = models.TextField(db_name='address')
objects = CustomManager()
之后,在您针对Person
模型的任何查询集中,默认情况下都不会_address
在查询中包含字段。
推荐阅读
- list - ansible 创建特定的字典
- angular - 如何避免在 Angular Universal 中使用包
- python-3.x - 从命令行运行 python 函数 - 由于完整的文件路径,语法无效
- php - 将序列号添加到表中
- javascript - 按管道字符拆分 CSV 列并计算唯一值
- php - 查询更改时如何在php中重置页面
- php - Livewire Laravel fetch( `${window.livewire_app_url}/livewire/message/${payload.fingerprint.name}`, probelm
- windows-10 - 从 Windows 10 映像备份中浏览和恢复特定文件?
- cmake - gcc的CMake链接器标志:/usr/bin/ar:-v:没有这样的文件或目录
- nestjs - 在 CQRS 中注入的 nestjs 服务未定义