是否有方法将变量名引用为该变量中的字符串';Python中的s声明?

是否有方法将变量名引用为该变量中的字符串';Python中的s声明?,python,django,Python,Django,对于Django应用程序,我有一个字段名(键)字典,映射到帮助文本(值)(我从csv文件中读取)。在models.py中,我想为每个字段名检索适当的帮助文本 如果我有如下示例字典,每个字段都有一个条目: test_dict = { 'host_name': 'The name of a host', ... } 我的models.py如下所示: class Host_main(models.Model): host_name = models.CharField(m

对于Django应用程序,我有一个字段名(键)字典,映射到帮助文本(值)(我从csv文件中读取)。在
models.py
中,我想为每个字段名检索适当的帮助文本

如果我有如下示例字典,每个字段都有一个条目:

test_dict = {
    'host_name': 'The name of a host',
     ...
}
我的
models.py
如下所示:

class Host_main(models.Model):

    host_name = models.CharField(max_length=20, unique=True, help_text=test_dict['host_name'])
    
    def __str__(self):
        return self.host_name
是否有一种方法可以在每个
help\u文本
定义中动态调用变量名(
host\u name

我可以选择执行以下操作:

from varname import nameof
host_name = models.CharField(max_length=20, unique=True, help_text=test_dict[nameof(host_name)])
但如果可能的话,我希望引用当前变量名时使用一致的内容,以避免再次键入字段名,如伪代码中的
help\u text=test\u dict[nameof(**this**)]


谢谢

让我们把问题简化一点,先去掉django部分。假设您有一个名为
a
的类,那么您可以使用

A类:合格
A.foo='bar'
或者,您也可以这样做

setattr(A,'bar','baz')
您可以通过检查来验证这些确实是等效的

print(A.foo)#条
打印(A.bar)#baz
因此,如果您要定义一个普通类,您几乎可以通过
dict
循环,并通过
setattr
调用进行设置,在这种情况下,您可以控制变量名

当我们把Django引入到这个问题中时,事情就有点复杂了……当你初始化一个
模型
类时,会发生一些事情。基本上,它对已经定义的内容进行查找,并通过几乎公共-私有的
\u meta
API转换所有已定义的字段。这意味着在定义时间之外添加类属性将不起作用,您可能需要使用一些技巧直接通过其元类构造类(如果您不熟悉Python的元类,则类基本上是其元类的实例)

动态构造类的基本语法是通过带有3个参数的
type
调用:
type(name、base、dict)
。以你为例,

class Host\u main(models.Model):
host\u name=models.CharField(最大长度=20,唯一性=True,帮助文本=test\u dict['host\u name'])
定义(自我):
返回self.host\u名称
相当于

def Host_main_str(self):#这里的名称并不重要,除非您关心函数的uuu name_uu属性,您可以覆盖该属性。
返回self.host\u名称
Host\u main=type('Host\u main',(models.Model,){
“uuu str”:主机u main u str”,
“主机名”:models.CharField(最大长度=20,唯一性=True,帮助文本=test\u dict['host\u name'])
})
实际上是django构造了他们所有的QuerySet类(如果我没记错的话,django对动态类构造做了一些更疯狂的事情,但我找不到一个好的例子)

所以,你可以这样做


attr_dict={''u______':'Host_main_str'}
对于名称,请参阅test_dict.values()中的帮助文本:
attr\u dict[name]=models.CharField(最大长度=20,唯一性=True,帮助文本=help文本)
Host\u main=type('Host\u main',(models.Model,),attr\u dict)

如果你真的坚持要循环查字典。

让我们把你的问题简化一点,先去掉django部分。假设您有一个名为
a
的类,那么您可以使用

A类:合格
A.foo='bar'
或者,您也可以这样做

setattr(A,'bar','baz')
您可以通过检查来验证这些确实是等效的

print(A.foo)#条
打印(A.bar)#baz
因此,如果您要定义一个普通类,您几乎可以通过
dict
循环,并通过
setattr
调用进行设置,在这种情况下,您可以控制变量名

当我们把Django引入到这个问题中时,事情就有点复杂了……当你初始化一个
模型
类时,会发生一些事情。基本上,它对已经定义的内容进行查找,并通过几乎公共-私有的
\u meta
API转换所有已定义的字段。这意味着在定义时间之外添加类属性将不起作用,您可能需要使用一些技巧直接通过其元类构造类(如果您不熟悉Python的元类,则类基本上是其元类的实例)

动态构造类的基本语法是通过带有3个参数的
type
调用:
type(name、base、dict)
。以你为例,

class Host\u main(models.Model):
host\u name=models.CharField(最大长度=20,唯一性=True,帮助文本=test\u dict['host\u name'])
定义(自我):
返回self.host\u名称
相当于

def Host_main_str(self):#这里的名称并不重要,除非您关心函数的uuu name_uu属性,您可以覆盖该属性。
返回self.host\u名称
Host\u main=type('Host\u main',(models.Model,){
“uuu str”:主机u main u str”,
“主机名”:models.CharField(最大长度=20,唯一性=True,帮助文本=test\u dict['host\u name'])
})
实际上是django构造了他们所有的QuerySet类(如果我没记错的话,django对动态类构造做了一些更疯狂的事情,但我找不到一个好的例子)

所以,你可以这样做


attr_dict={''u______':'Host_main_str'}
对于名称,请参阅test_dict.values()中的帮助文本:
attr\u dict[name]=models.CharField(最大长度=20,唯一性=True,帮助文本=help文本)
Host\u main=type('Host\u main',(models.Model,),attr\u dict)
如果你