是否有方法将变量名引用为该变量中的字符串';Python中的s声明?
对于Django应用程序,我有一个字段名(键)字典,映射到帮助文本(值)(我从csv文件中读取)。在是否有方法将变量名引用为该变量中的字符串';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
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)
如果你