1

私はそのようなことをしようとしています:

class PollResults(models.Model):
    votes_0 = models.IntegerField( default=0 )
    votes_1 = models.IntegerField( default=0 )
    votes_2 = models.IntegerField( default=0 )
    votes_3 = models.IntegerField( default=0 )
    votes = [votes_0,votes_1,votes_2,votes_3]

    def add_vote(self,choice):
        self.votes[choice] = self.votes[choice]+1

しかし、add_vote(0) を呼び出すと、「+ のサポートされていないオペランド型: 'IntegerField' および 'int'」 が表示されます。

それを機能させる方法はありますか?データベースの設計を批判しないでください。これは単なる例です。ポイントは、フィールド値を取得/設定する方法です。

4

1 に答える 1

2

機能しない理由は、votes変数でフィールド オブジェクト自体を参照しているためです。models.IntegerField(default=0) + 1あなたのコードは、もちろん無効なのと同じことをしています。

最も簡単な解決策は、単純に新しい属性を取得/設定し、django マジックにフィールド -> 値変換を処理させることです。

def add_vote(self,choice):
    attname = 'votes_{0}'.format(choice) # get the attribute name
    value = getattr(self, attname) # get the value
    setattr(self, attname, value+1) # set the value

このvotesフィールドを使用してインデックス/フィールドを決定する場合は、アクセスField.attnameしてフィールドの属性名を把握できます。

def add_vote(self,choice):
    attname = self.votes[choice].attname
    value = getattr(self, attname) # get the value
    setattr(self, attname, value+1) # set the value
于 2012-05-15T20:14:06.287 に答える