Django добавление нескольких пользователей в модель лобби
Я хочу добавить пользователей в поле игроков в лобби, но не знаю как. Каждый пользователь должен быть только в одном лобби.
Модель пользователя
class GeoUser(AbstractUser):
user_score = models.IntegerField(default=0)
email = models.EmailField(unique=True)
Лобби-модель
class Lobby(models.Model):
lobby_code = models.CharField(
max_length=18, unique=True)
players = # here i want to add multiple users that should be in the lobby
Заранее спасибо
Я бы посоветовал вам добавить ForeignKey в модель GeoUser, указывающую на модель Lobby. Это OneToMany отношение для Lobby, потому что один GeoUser будет находиться в одном Lobby, но на самом деле нет предела тому, сколько GeoUser объектов может находиться в Lobby.
class GeoUser(AbstractUser):
user_score = models.IntegerField(default=0)
email = models.EmailField(unique=True)
lobby = models.ForeignKey('Lobby', on_delete=models.SET_NULL, null=True, default=None, related_name='users')
class Lobby(models.Model):
lobby_code = models.CharField(
max_length=18, unique=True)
def players(self):
return self.users.all()
Чтобы получить всех игроков, просто сделайте колл:
lobby = Lobby.objects.first()
lobby.players() # returns a QuerySet of all related GeoUser objects
Я полагаю, что вы ищете поле ManyToManyField, которое вы реализуете следующим образом:
players = models.ManyToManyField(GeoUser)
У вас есть ограничение, что пользователь должен быть частью максимум 1 лобби. Думаю, технически вы могли бы каждый раз перебирать все лобби и проверять, находится ли пользователь в каком-либо лобби. Если вы планируете иметь много лобби, то, вероятно, имеет смысл сохранить лобби пользователя в модели User.
На мой взгляд, гораздо лучше создать отдельную модель, отвечающую за поддержание связи между пользователем и лобби (см. документацию Django для параметра through). Теперь вы сможете обеспечить уникальность с помощью UniqueConstraint, а также сохранить другие метаданные, например, временную метку, когда они присоединились.