我試圖實現一個投票系統,爲我的網站上每種類型的用戶保持跟蹤投票。我的計劃是創建一個投票模型,記錄每個用戶類型的最多投票和總投票數,並計算最多投票的百分比。Django - 在模型中動態創建字段名稱(字段不保存)
硬編碼的,看起來是這樣的:
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)我是否在邏輯上接近這個投票想法?我的一部分感覺像是有一種更容易的方法來跟蹤多種類型用戶的投票。
任何幫助表示讚賞!謝謝!
非常有幫助,'選擇'是我以前沒見過的一個有用的工具。我知道我的方式太複雜了...... – chipperdrew