【问题标题】:Django save() does not workDjango save() 不起作用
【发布时间】:2014-05-18 07:41:09
【问题描述】:

我正在写一份选举申请。在这个过程中,我定义了一个 Election 模型和一个 Candidate 模型。

注意:我使用的是 Django 版本 1.3.7,Python 2.7.1。

选举方法之一,

Election.count_first_place(self)

旨在计算每个候选人获得的第一名选票数量并更新候选人的 numVotes 属性。但由于某种原因,无论选票如何,它们都保持为零。

注意:我正在实施 STV,因此每张选票都包含一个候选人数组(ballot.voteArray),按照最喜欢(位置零)到最不喜欢(位置 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 也是如此。

这是怎么回事???

【问题讨论】:

    标签: mysql database django model


    【解决方案1】:

    这是一个非常奇怪的表结构。腌制其他模型实例是一个非常糟糕的主意:腌制的版本不会在它们的数据库行更新时更新。确实,您应该存储一个候选人 ID 数组,或者甚至更好地创建从选票到候选人的多对多关系,并使用指示位置的直通表。

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

    【讨论】:

    • 我没有意识到您可以使用“直通表”之类的东西来指示元素在多对多关系中的位置。这是否是处理数据的最佳方式,例如具有必须召回的特定顺序的投票数组?另外,表结构还有什么奇怪的地方?请注意,它有点简化,以免不必要的细节使问题混乱。
    • 决定改用链表,因为直通表不能满足我们的需求……当然我的意思是我不能让它工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多