【问题标题】:django object get/set fielddjango 对象获取/设置字段
【发布时间】:2010-10-20 07:09:14
【问题描述】:

我可以通过obj.field以外的其他方式获取对象字段的值吗?像obj.get('field') 这样的东西存在吗?设置字段的值也是如此。

【问题讨论】:

标签: django-models


【解决方案1】:

获取字段的值:

getattr(obj, 'field_name')

设置字段的值:

setattr(obj, 'field_name', 'field value')

获取 Django 对象的所有字段和值:

[(field.name, getattr(obj,field.name)) for field in obj._meta.fields]

你可以阅读Model _meta API的文档,非常有用。

【讨论】:

  • 或者,用字典中的项目更新'''obj''':[setattr(obj, key, value) for (key, value) in dictionary.items()]
【解决方案2】:

获取相关字段:

def getattr_related(obj, fields):
    a = getattr(obj, fields.pop(0))
    if not len(fields): return a
    else:               return getattr_related(a, fields)

例如,

getattr_related(a, "some__field".split("__"))

不知道,也许有更好的方法,但对我有用。

【讨论】:

    【解决方案3】:

    如果有人偶然发现这个小问题,答案就在这里: How to introspect django model fields?

    【讨论】:

      【解决方案4】:

      你为什么要这个?

      你可以使用

      obj.__dict__['field']
      

      我猜……虽然它不是方法调用

      changed=[field for (field,value) in newObj.__dict__ if oldObj.__dict__[field] != value]
      

      将为您提供所有已更改字段的列表。

      (虽然我不是 100% 确定)

      【讨论】:

      • 在为该对象提交编辑表单后,我有: oldObj = ObjModel.objects.get(pk=pk) newObj = editForm.save(commit = False) 我想比较这两个对象,我需要知道编辑表单更改了哪些字段。除了逐个字段比较对象之外,还有什么更简单的方法吗?
      • 并不总是有效(外键破坏了这一点)。请改用@João Marcus 的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 2016-03-01
      • 2019-01-25
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多