0

私はDjangoフォーラムプロジェクトの作成に取り組んでおり、settingsというテーブルのデータベースにアクセスする「settings」アプリを持っています。

テーブルは、、、および列で設定さverbose_namenameますvalue。1つ目は単に管理者に表示される名前であり、2つ目は設定にアクセスするための名前です(テーブルの主キーです)。

今、私はブール値であるいくつかの設定、整数であるいくつか、そして文字列であるいくつかの設定を持っています。ただし、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

だから私は2つの質問があります:

  1. これについてもっと良い方法はありますか?
  2. 文字列に整数が含まれているかどうかを確認するにはどうすればよいですか?有効であれば整数に変換できることは知っていint()ますが、有効かどうかはどうすればわかりますか?

明らかに、質問番号2に関しては、現在の評価の「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を意味する場合に、たまたま1である整数を誤ってTrueに変換する可能性があるため、「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 に答える