0

我正在创建一个 Django 论坛项目,并且我有一个“设置”应用程序,它可以访问名为设置的表的数据库。

该表设置有verbose_namenamevalue列。第一个只是要显示给管理员的名称,第二个是访问设置的名称(并且是表上的主键。)

现在,我有一些设置是布尔值,一些是整数,还有一些是字符串。但是,value是数据库中的 TEXT 类型,因此 Django 将其作为字符串返回。现在我有这个实现将布尔值转换为 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

所以我有两个问题:

  1. 有没有更好的方法来解决这个问题?
  2. 如何确定字符串是否包含整数?我知道我可以将它转换为一个整数,int()如果它是有效的,但我怎么知道它是否有效呢?

显然,关于第二个问题,我将删除当前评估的“或”“1”和“或”“0”位。

4

3 回答 3

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
于 2013-02-01T15:54:24.227 回答
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(如果它是一个),请执行

try:
    setting = int(setting)
except ValueError:
    pass
于 2013-02-01T16:01:29.390 回答
0

您可以简单地使用:

if setting.value in ["true", "True", 1, "1"]:
    setting.value = True
于 2013-02-01T16:01:10.440 回答