【问题标题】:Is it possible to reference a field in Django using brackets?是否可以使用方括号引用 Django 中的字段?
【发布时间】:2020-07-22 07:10:11
【问题描述】:

你好,我想看看是否有能力在 Django 中使用方括号引用模型

//model
class User(model.Model):
   firstname = models.charField()

//referencing

    user = User.objects.get(id=1)


   //original reference
    user.firstname = "John"


   // proposed reference
     user["firstname"] = "John"

这可能吗,或者是否有任何替代建议的参考

【问题讨论】:

  • 你为什么要那个?你想用它来达到什么目的?
  • 基本上我正在从前端向后端发送信息,并且每个页面都有多个不同的字段,我希望能够只用一个函数保存这些信息@迪克格罗滕
  • 那么下标符号有什么帮助呢?如果您正在循环键/值,您也可以只使用setattr(user, key, value)key = 'firstname'user.firstname = value 相同。

标签: python django class django-models model


【解决方案1】:

您可以在模型中实现__getitem____setitem__,然后调用getattr(..)setattr(..)。例如,您可以在 Model 类中进行猴子修补:

from django.db.models import Model

Model.__getitem__ = lambda x, y: getattr(x, y)
Model.__setitem__ = lambda x, y, v: setattr(x, y, v)

但通常不是有两种方法来完成某事是一个好主意。正如 Python 之禅 中所指定的那样:

应该有一种——最好只有一种——明显的方法。

如果您想根据包含名称的字符串更改属性,您可以通过以下方式实现:

<b>setattr(</b>user, 'firstname', 'John'<b>)</b>

【讨论】:

    【解决方案2】:

    如果目标是根据键/值对字典更新对象,则不需要 下标 表示法:

    • 使用setattr
      setattr(user, key, value)
      
      将属性key 设置为value,因此如果key = 'firstname'user.firstname = value 相同。
    • 或者直接在数据库中更新对象。假设您的键/值对字典与您要更新的字段匹配:
      User.objects.filter(id=1).update(**kwargs)
      
      将直接保存对象。例如,如果kwargs{'firstname': 'John'},它只会更新名字。请注意您的 filter() 表达式与您要更新的正确对象匹配。

    【讨论】:

      猜你喜欢
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2010-10-14
      相关资源
      最近更新 更多