我正在撰写选举申请书。在此过程中,我定义了一个选举模型和一个候选模型。
注意:我使用的是Django 1.3.7版,Python 2.7.1。
选举方法之一
Election.count_first_place(self)
旨在计算每位候选人收到的第一名投票数,并更新候选人' numVotes属性。但出于某种原因,无论选票如何,他们都会保持零。
注意:我实施STV,因此每个选票包含候选者的数组(ballot.voteArray),按照最优选(位置0)到最不优选(位置n)的顺序。我已经使用PickledObjectField实现了此列表(请参阅link)。
models.py
class Candidate(models.Model):
election = models.ForeignKey("Election")
numVotes = models.FloatField(blank=True)
class Ballot(models.Model):
election = models.ForeignKey("Election", related_name = "ballot_set")
voteArray = PickledObjectField(null=True,blank=True)
class Election(models.Model):
position = models.CharField(max_length = 50)
candidates = models.ManyToManyField(Candidate,related_name="elections_in",null=True,blank=True)
def count_first_place(self):
#retrieve all of the ballots cast in this election
ballots = Ballot.objects.filter(election = self)
for ballot in ballots.all():
# the first element of a ballot's voteArray is a Candidate object
first_place_choice = ballot.voteArray[0]
first_place_choice.numVotes += 1
first_place_choice.save()
ballot.save()
self.save()
以下是我运行测试时会发生的事情:
注意:我意识到我的保存方式比必要的更频繁。只是在我测试这个东西时绝对确定它会在需要时保存。
elec = Election(position="Student Body President")
elec.save()
j = Candidate(election=elec,numVotes=0)
j.save()
e = Candidate(election=elec,numVotes=0)
e.save()
b = Candidate(election=elec,numVotes=0)
b.save()
elec.candidates.add(j,e,b)
elec.save()
ballot1 = Ballot(election=elec,voteArray=[j,e,b])
ballot1.save()
ballot2 = Ballot(election=elec,voteArray=[j,b,e])
ballot2.save()
ballot3 = Ballot(election=elec,voteArray[e,b,j])
ballot3.save()
所以在这一点之后,j有两个2位投票,e有1.但是当我跑
时elec.count_first_place()
j仍然有零票,e和b也是如此。
该怎么做?
答案 0 :(得分:0)
这是一个非常奇怪的表结构。挑选其他模型实例是一个非常糟糕的主意:当数据库行执行时,pickle版本将不会更新。真的,你应该存储一系列候选ID,或者甚至更好地创建一个从Ballot到Candidate的多对多关系,并带有表示位置的直通表。
但我认为你的问题比这简单。你说对象仍然没有投票:那是因为你没有更新那些特定的实例。同样,除了加载和保存之外,Django实例和数据库行之间没有直接关系。您需要从数据库重新加载对象以查看任何更新。