Как избежать дублирования с помощью таблицы «многие ко многим» в Django - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь создать приложение, в котором пользователи могут создавать «конкурсы» (думать о них как о выборах), заполнять бюллетени кандидатами, а затем голосовать за них, но вместо того, чтобы отдать один голос за одного кандидата, оцените их в порядок предпочтений.

Пока это моя модель:

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()

Однако я бы хотел, чтобы в таблице предпочтений не было двух строк для разных кандидатов, где предпочтения также одинаковы. То есть в том же избирательном бюллетене нельзя допускать, чтобы:

  • Джон Доу, предпочтение = 1
  • Foo Bar, предпочтение = 1

Нужно ли мне просто контролировать это в HTML, когда кто-то подает голос? Конечно, вышесказанное должно быть разрешено, но ТОЛЬКО если эти два голоса пришли от разных людей. Я бы предпочел контролировать это в базе данных, если это возможно.

1 Ответ

0 голосов
/ 07 апреля 2019

Кажется, я наткнулся на ответ ...

добавление:

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

делает так, что любые внешние ключи или предпочтения должны отличаться.

Теперь единственное, что нужно - это убедиться, что кто-то не может выставить одного и того же кандидата из одного и того же бюллетеня при двух разных предпочтениях. Я полагаю, что я мог бы удалить «андидат_префер »из атрибута unique_together, и это позволило бы добиться того, чего я хочу, поскольку каждый избиратель будет голосовать только по одному бюллетеню для каждого конкурса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...