避免在Django中通过表进行多对多重复

时间:2019-04-07 06:08:38

标签: django python-3.x

我正在尝试构建一个应用程序,用户可以在其中创建“竞赛”(将其视为选举),将候选人填入选票,然后对其进行投票,但与其对一个候选人投一票,不如对他们进行排名优先顺序。

到目前为止,这是我的模型:

class Contest(models.Model):
    contest_text = models.CharField(max_length=350)
    pub_date = models.DateTimeField('Start Date')

    def __str__(self):
        return self.contest_text


class Candidate(models.Model):
    contest = models.ForeignKey(Contest, on_delete=models.CASCADE, related_name='candidates')
    candidate_name = models.CharField(max_length=80)

    def __str__(self):
        return self.candidate_name


class Ballot(models.Model):
    contest = models.ForeignKey(Contest, on_delete=models.CASCADE, related_name='ballots')
    votes = models.ManyToManyField(Candidate, through='Preference')


class Preference(models.Model):
    candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE)
    ballot = models.ForeignKey(Ballot, on_delete=models.CASCADE)
    candidate_preference = models.PositiveSmallIntegerField()

但是,我想避免首选项表在首选项也相同的情况下针对不同的候选对象有两行。即在同一张选票上,不允许这样做:

  • John Doe,首选项= 1
  • Foo Bar,偏好设置= 1

当有人提交投票时,我是否只需要在HTML中进行控制?当然,应该允许上述情况,但是只有当这两个选票来自不同的人时才可以。如果可能的话,我也希望在数据库中对此进行控制。

1 个答案:

答案 0 :(得分:0)

我想我偶然发现了一个答案...

添加:

class Meta:
    unique_together = ('candidate', 'ballot', 'candidate_preference')

makes是,所以任何外键或首选项都必须不同。

现在唯一的事情就是确保在两种不同的偏好下,某人不能从同一张选票中选拔同一位候选人。我想我可以从unique_together属性中删除“ candidate_preference”,这将实现我想要的功能,因为每个选民只会为每个比赛投票一次。