Django: уникальное ограничение не применяется - PullRequest
0 голосов
/ 19 января 2020

Заранее спасибо!

В Python я пытаюсь использовать UniqueConstraint следующим образом:

class CitationVote(models.Model):
    user_who_voted = models.ForeignKey('User', on_delete=models.CASCADE)
    vote = models.IntegerField(choices = [(-1, "down"), (1, "up")])
    timestamp_voted = models.DateTimeField()
    citation_id = models.ForeignKey('Citation', on_delete=models.CASCADE)
    class meta:
        constraints = [models.UniqueConstraint(fields=['user_who_voted', 'citation_id'], name='one_vote_pp')]

Хотя в документах Django 3.0 не упоминается никаких ограничений при использовании UniqueConstraint с внешним ключом (или Unique_Together, ни один из которых не работает в этом примере), ограничение, конечно, не применяется при тестировании. В миграциях я тоже не вижу ничего, что указывало бы на ограничение, применяемое в Postgres.

Для удовольствия я изменил код на:

class CitationVote(models.Model):
    user_who_voted = models.ForeignKey('User', on_delete=models.CASCADE)
    vote = models.IntegerField(choices = [(-1, "down"), (1, "up")])
    timestamp_voted = models.DateTimeField()
    citation_id = models.ForeignKey('Citation', on_delete=models.CASCADE)
    class meta:
        constraints = [models.UniqueConstraint(fields=['vote', 'timestamp_voted'], name='one_vote_pp')]

Увы, происходит то же самое (и да, я удаляю всю БД и воссоздаю ее каждый раз по * sh) - - никакие ограничения не применяются, в миграциях нет никаких оснований полагать, что это будет после их применения.

Я что-то здесь не так делаю?

Спасибо!

1 Ответ

1 голос
/ 19 января 2020

Ваш meta класс должен быть с большой буквы M , поэтому он должен быть:

class Meta:
    constraints = [
        models.UniqueConstraint(fields=['user_who_voted', 'citation_id'], name='one_vote_pp')
    ]

В противном случае ваше уникальное ограничение выглядит нормально.

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