使用字符串而不是点语法访问Django模型的字段?

dav*_*gan 69 django django-models

在Django中,我可以这样做:

test = Test.objects.get(id=1)
test.name
Run Code Online (Sandbox Code Playgroud)

我希望能够使用动态生成的字符串访问属性,如下所示:

test['name']
Run Code Online (Sandbox Code Playgroud)

或者,使用字符串的任何其他语法.我试过了

test._meta.get_field_by_name('name')
Run Code Online (Sandbox Code Playgroud)

但这会返回字段本身而不是值.

有任何想法吗?

Cas*_*par 99

你可以使用python的内置getattr()函数:

getattr(test, 'name')
Run Code Online (Sandbox Code Playgroud)

  • 一分钟太慢了!不应该花时间测试它;) (2认同)
  • 啊,我甚至不必使用Django功能,而且我学到了一些关于Python的新东西.谢谢您的帮助. (2认同)

ari*_*rie 15

假设name是您实例的属性,测试 getattr(test, 'name')应该返回相应的值.或者test.__dict__['name'].

您可以getattr()在这里阅读更多信息:http://effbot.org/zone/python-getattr.htm


dav*_*ang 10

其他答案仍然有效,但现在你可以使用Django的_meta.get_field()来做到这一点.

test._meta.get_field('name')
Run Code Online (Sandbox Code Playgroud)

请注意,Model _meta API从1.8 开始已经开始其官方支持和文档,但在其官方文档之前已经在先前版本中分发和使用.

  • 这仍然会返回字段本身,并且OP对字段的值感兴趣。 (2认同)

Jam*_*s R 6

在Python中,通常可以访问具有dict方法的对象内的值。

假设您有这个课程:

class Dog(object):
    def __init___(self, color):
        self.color = color
Run Code Online (Sandbox Code Playgroud)

然后我实例化它:

dog = Dog('brown')
Run Code Online (Sandbox Code Playgroud)

所以我可以通过执行以下操作来查看颜色:

print dog.color
Run Code Online (Sandbox Code Playgroud)

我还可以通过执行以下操作来查看颜色:

print dog.__dict__['color']
Run Code Online (Sandbox Code Playgroud)

我可以设置颜色:

print dog.__dict__['color'] = 'green'

print dog.color

>>>green
Run Code Online (Sandbox Code Playgroud)

  • 它会起作用,但一般来说,如果可能的话,您希望避免使用带下划线的属性/方法。这是一个信号,表明它们是不稳定的(随时可能被完全删除或本质上改变,没有警告)或由于某些其他原因不打算成为公共接口的一部分。有时您必须这样做,但在这种情况下,“getattr”可用,因此是正确的选择。 (2认同)