gpt4 book ai didi

python - Django 从所有查询中排除字段

转载 作者:行者123 更新时间:2023-12-02 03:08:13 24 4
gpt4 key购买 nike

我正在 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 字段?如果我们部署删除了 _address 字段的版本 3,则版本 2 的代码仍将尝试在选择时获取 _address,即使它没有在任何地方使用,并且会失败并显示“否”这样的专栏”异常(exception)。

有没有办法阻止这种情况,并在版本 2 的代码中将某些字段标记为“不可获取”?所以版本 2 不会删除字段,但不会再获取它,版本 3 将删除字段。

最佳答案

您可以使用自定义对象管理器来延迟所有查询集的特定字段。

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 字段。

关于python - Django 从所有查询中排除字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58431462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com