2012-04-14 16 views
0

私はPythonを学ぶのを助けるために、私はDjangoを使って簡単な問題追跡ツールを書いています。Djangoの関連マネージャはタプルをUnicode文字列に変換しますか?

私はIssueの状態を維持するために使用されるISSUE_STATEタプルがあり

、2つの単純なクラス(簡単のためにいくつかのコードを左)が IssueVersion

ISSUE_STATE = (
    ('p', 'In Progress'), 
    ('o', 'Open'), 
    ('r', 'Resolved'), 
    ('c', 'Closed'), 
) 

それが維持されますIssueのように:

class Issue(models.Model): 
    state = models.CharField(max_length=1, choices=ISSUE_STATE) 
    fix_version = models.ForeignKey(Version, related_name='issuesAsFix', null=True, blank=True, default=None) 

(ご覧のとおり、VersionIssueオブジェクトのリストを維持して)

問題:。

私は、個々のIssueインスタンスの状態にアクセスが、それはタプルとして返されます。

>>> v = Version() 
>>> v.save() 

>>> i = Issue() 
>>> i.fix_version = v 
>>> i.state = ISSUE_STATE[1] 
>>> i.save() 

>>> i.state 
('o', 'Open') 
>>> v.issuesAsFix.all()[0].state 
u"('o', 'Open')" 

>>> i == v.issuesAsFix.all()[0] 
True 
>>> i is v.issuesAsFix.all()[0] 
False 

なぜVersionの子プロパティとしてIssue文字列のstate変数にアクセスされる:Versionオブジェクトによって提供されるように、私はIssueの状態にアクセスすると、それは、Unicode文字列として返されるのですか?

ありがとうございます!

答えて

1
>>> i.state = ISSUE_STATE[1] 

この行が正しくありません。

>>> i.state = ISSUE_STATE[1][0] 
+0

したがって、 'state'変数は実際にはタプルの 'key'ではなく、その単一文字を実際に指すべきではありませんか? –

+0

正しい。 ORMはそれに対してDTRTを行います。 –

+0

。私に混乱を招くパズルの1つは、「CharField」の「max_length」が「1」に設定されていても、Unicode文字列全体が最初の文字ではなくデータベースに格納されているということです。これは、ビュー/フォームレベルでのみ適用され、シェルを使用するときではありませんか? –

関連する問題