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, а также сохранить другие метаданные, например, временную метку, когда они присоединились.

Вернуться на верх