Да, на самом деле по умолчанию unique_together
- это набор коллекций полей, которые уникальны вместе, что-то вроде:
class Player(models.Model):
name = models.CharField(max_length=50)
team = models.ForeignKey('Team', on_delete=models.CASCADE, blank=True, null=True)
game = models.ForeignKey('Game', on_delete=models.CASCADE)
objects = GameManager()
class Meta:
unique_together = <b>(</b>('name', 'game',)<b>,</b> ('user', 'game',)<b>)</b>
Здесь мы, таким образом, указываем, что каждая пара name, game
уникальна, а каждая пара user, game
уникальна. Поэтому невозможно создать два Player
объекта для одинаковых user
и game
или для одинаковых game
и name
.
Только потому, что одиночное ограничение unique_together
является довольно распространенным, можно также передавать одну коллекцию имен полей, которые должны быть уникальными вместе, как написано в документации в Options.unique_together
[Django- документ]
Устанавливает имен полей, которые вместе взятые должны быть уникальными:
unique_together = (("driver", "restaurant"),)
Это кортеж кортежей, который должен быть уникальным, если учитывать
все вместе. Он используется в админке Django и применяется на
уровень базы данных (т.е. включены соответствующие операторы UNIQUE
в операторе CREATE TABLE
).
Для удобства unique_together
может быть одним кортежем при работе с одним набором полей:
unique_together = ("driver", "restaurant")