Как использовать два уникальных ограничения в модели Django? - PullRequest
0 голосов
/ 06 января 2019

У меня есть модель Django для игрока в игре

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 = ('name', 'game',)

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

Теперь я хотел бы расширить нашу страницу, добавив зарегистрированных пользователей. Итак, я бы добавил это к модели.

        user = models.ForeignKey('auth.User', on_delete=models.CASCADE, blank=True, null=True)

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

       unique_together = ('user', 'game',)

Можно ли дать в Django два уникальных ограничения для модели? Или мне нужно искать в таблице вручную перед сохранением новых записей? Или есть лучший способ?

Спасибо

1 Ответ

0 голосов
/ 06 января 2019

Да, на самом деле по умолчанию 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")
...