我正在创建一个Django论坛项目,我有一个“设置”应用程序,可以访问数据库中的一个名为settings的表。
该表格设置为verbose_name
,name
和value
列。第一个是向管理员显示的名称,第二个是访问该设置的名称(并且是表中的主键。)
现在,我有一些设置是布尔值,有些是整数,有些是字符串。但是,value
是数据库中的TEXT类型,因此Django将其作为字符串返回。现在我有这个实现将booleans转换为Python布尔类型:
class SettingsMiddleware:
def process_request(self, request):
request.settings = {}
settings = Setting.objects.all()
for setting in settings:
if setting.value == ("True" or "1"):
setting.value = True
if setting.value == ("False" or "0"):
setting.value = False
request.settings[setting.name] = setting.value
return None
所以我有两个问题:
int()
的整数,但是如何判断它是否有效?显然,对于第二个问题,我会删除当前评估中的“1”和“0”位。
答案 0 :(得分:2)
在我看来,ast.literal_eval
可能对您有用。
>>> import ast
>>> ast.literal_eval("1")
1
>>> ast.literal_eval("0")
0
>>> ast.literal_eval("True")
True
>>> ast.literal_eval("False")
False
>>> ast.literal_eval("'foobar'")
'foobar'
>>> ast.literal_eval("1.2")
1.2
>>> ast.literal_eval("1.2e3")
1200.0
>>> ast.literal_eval("1,2")
(1, 2)
>>> ast.literal_eval("[1,2]")
[1, 2]
>>> ast.literal_eval("[1,2,(1,2)]")
[1, 2, (1, 2)]
>>> ast.literal_eval("1f")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/ast.py", line 49, in literal_eval
node_or_string = parse(node_or_string, mode='eval')
File "/usr/local/lib/python2.7/ast.py", line 37, in parse
return compile(source, filename, mode, PyCF_ONLY_AST)
File "<unknown>", line 1
1f
^
SyntaxError: unexpected EOF while parsing
答案 1 :(得分:1)
如果你想将它限制为0,1,True,False,我会做
boolmapping = {'0':False, 'False': False, '1':True, 'True':True}
...
setting = boolmapping.get(setting, setting)
但是,这可能会错误地将碰巧为1的整数转换为True,而真正意味着1,因此您可以更好地将“1”映射到1
,而不是True
。
要将字符串转换为int(如果为1),请执行
try:
setting = int(setting)
except ValueError:
pass
答案 2 :(得分:0)
您可以简单地使用:
if setting.value in ["true", "True", 1, "1"]:
setting.value = True