サイトの各タイプのユーザーの投票を追跡する投票システムを実装しようとしています。私の計画は、各ユーザー タイプの賛成票と合計票を追跡し、賛成票のパーセンテージを計算する投票モデルを作成することでした。
次のようにハードコードされています。
class Eduuser(AbstractUser):
TYPE_1 = 'TY1'
TYPE_2 = 'TY2'
...
USER_TYPE_CHOICES = (
(TYPE_1, 'Type 1'),
(TYPE_2, 'Type 2'),
...
)
user_type = models.CharField(max_length=3, choices=USER_TYPE_CHOICES)
class Vote(models.Model):
a = models.IntegerField(
default=0, name=getattr(Eduuser, 'TYPE_1')+'_up')
b = models.IntegerField(
default=0, name=getattr(Eduuser, 'TYPE_2')+'_up')
...
c = models.IntegerField(
default=0, name=getattr(Eduuser, 'TYPE_1')+'_votes')
d = models.IntegerField(
default=0, name=getattr(Eduuser, 'TYPE_2')+'_votes')
...
def perc(self):
perc_array = []
for user_type in getattr(Eduuser, 'USER_TYPE_CHOICES'):
up = float(getattr(self, user_type[0]+'_up')) #Prevent int division
votes = getattr(self, user_type[0]+'_votes')
if votes==0:
perc_array.append(0)
else:
perc_array.append(round(up/votes, 3))
return perc_array
これ以上型を追加する予定はありませんが、コードをすっきりさせたいと思っています。ユーザータイプをループする私の最善の試みは次のとおりです。
class Eduuser(AbstractUser):
...
class Vote(models.Model):
for user_type in getattr(Eduuser, 'USER_TYPE_CHOICES'):
models.IntegerField(
default=0, name=user_type[0]+'_up')
models.IntegerField(
default=0, name=user_type[0]+'_votes')
def perc(self):
...
ただし、これはフィールドを保存しません(代入演算子がないためだと思います)。簡単な質問がいくつかあります。
1) 明示的に名前を割り当てずにフィールドを保存する方法はありますか? または、文字列名を変数に変換できますか (私が読んだ他の投稿から、これは悪い考えのようです)?
2) 私はこの投票のアイデアに論理的にアプローチしていますか? 私の一部は、複数のタイプのユーザーの投票を追跡するためのはるかに簡単なアプローチがあると感じています.
どんな助けでも大歓迎です!ありがとう!