当架构中不存在字段时,如何防止 django 出错?

Posted

技术标签:

【中文标题】当架构中不存在字段时,如何防止 django 出错?【英文标题】:How do I prevent django from erroring out when a field doesn't exist in the schema? 【发布时间】:2020-05-28 08:26:19 【问题描述】:

我希望能够将一个字段标记为未使用,从而防止 django 在数据库架构中的相应列不存在时出错。

我想这样做是因为部署未使用的代码不会导致网站崩溃。

类似

class SomeObject(Model):
  some_field = models.CharField(unused=True)

SomeObject.objects.all()[0].id  # this line should not fail

现在它给了

django.db.utils:OperationalError: (1054, "Unknown column 'someobject.some_field' in 'field list'")

【问题讨论】:

您是否尝试过将some_field 从您的模型定义中排除?如果它在架构中,它将忽略它(我认为)。 【参考方案1】:

标准方法是使用try:except 语句,reference。在您的示例中,

try:
    SomeObject.objects.all()[0].id
exept OperationalError:
    pass # or whatever you want in this case

如果您经常使用模型,请考虑重新定义其 get_queryset 函数。例如,

class YourClass:
def get_queryset(self, request):
    try:
        super(your-model-super, self).get_queryset(request)
    exept OperationalError, error:
        if error.code == 1054:
            pass
        else:
            raise

我想不出任何其他方法来处理这个问题。

【讨论】:

如果我在一个高度使用的模型上添加这个字段,比如说,用户,我不能将这个应用于引用用户的每一位代码。如果出于未使用字段以外的原因抛出 OperationalError,我也想抛出它。 如果您经常使用模型,请考虑重新定义其 get_queryset 函数。例如 class YourClass: def get_queryset(self, request): try: super(your-model-super, self).get_queryset(request) exept OperationalError, error: if error.code == 1054: pass else: raise I edit我的答案是为了更清楚地显示代码。

以上是关于当架构中不存在字段时,如何防止 django 出错?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django Admin 中创建自定义显示字段(models.py 中不存在)

在 iTunes Connect 中创建用户时出错:年份无效

Django:如何检查自定义小部件定义中是不是存在字段错误?

Django REST Framework:当 POST 上存在额外字段时引发错误

PIG:无效的场投影。架构中不存在投影字段 [dept_no]

如何防止 Hibernate 删除 JSON 帖子中不存在的子对象?