我正在尝试实现一个投票系统,以跟踪我网站上每种类型用户的投票。我的计划是创建一个投票模型来跟踪每个用户类型的赞成票和总票数,并计算赞成票的百分比。
看起来像这样的硬编码:
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)我是否在逻辑上接近这个投票想法?我觉得有一种更简单的方法可以跟踪多种类型用户的投票。
任何帮助表示赞赏!谢谢!