Django save()不起作用

时间:2014-04-06 01:56:14

标签: mysql database django model

我正在撰写选举申请书。在此过程中,我定义了一个选举模型和一个候选模型。

注意:我使用的是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也是如此。

该怎么做?

1 个答案:

答案 0 :(得分:0)

这是一个非常奇怪的表结构。挑选其他模型实例是一个非常糟糕的主意:当数据库行执行时,pickle版本将不会更新。真的,你应该存储一系列候选ID,或者甚至更好地创建一个从Ballot到Candidate的多对多关系,并带有表示位置的直通表。

但我认为你的问题比这简单。你说对象仍然没有投票:那是因为你没有更新那些特定的实例。同样,除了加载和保存之外,Django实例和数据库行之间没有直接关系。您需要从数据库重新加载对象以查看任何更新。