Доступ к методам суперкласса в django - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть следующая модель, Пользователь

class User(AbstractBaseUser, PermissionsMixin, Base):
    email = models.EmailField(db_index=True, unique=True, max_length=255)
    mobile = PhoneNumberField(null=True)
    username = models.CharField(db_index=True, null=False, unique=True, max_length=255)

Базовый класс

class Room(Base):
    name = models.CharField(db_index=True, unique=True, max_length=255)
    status = models.CharField(default=RoomStatus.ACTIVE, max_length=256, null=True)
    members = models.ManyToManyField(User)
    last_activity = models.DateTimeField(default=timezone.now)

и двое детей

class LeagueRoom(Room):
    league = models.ForeignKey(League, on_delete=models.CASCADE, null=True)
    location = models.ForeignKey(Location, on_delete=models.CASCADE, null=True)

class ClubRoom(Room):
    club = models.ForeignKey(Club, on_delete=models.CASCADE, null=True)
    location = models.ForeignKey(Location, on_delete=models.CASCADE, null=True)

Я хочу получить доступ к leagueroom_set для пользователя. Я не уверен, как это сделать. У пользователя в настоящее время есть свойство room_set, но я хочу получить доступ к конкретному room_set. Может ли кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018
  1. Я думаю, вы хотите, чтобы Room был абстрактным базовым классом. Тогда то, что вы пытаетесь сделать, сработает. https://docs.djangoproject.com/en/2.1/topics/db/models/#model-inheritance

    class Room(models.Model):
        name = models.CharField(db_index=True, unique=True, max_length=255)
        # other fields
        …
    
        class Meta:
            abstract = True
    
  2. Если Room не может быть абстрактным классом, вам придется переместить поле членов из Room в каждый из подклассов, чтобы использовать встроенные отношения.

    class LeagueRoom(Room):
        league = models.ForeignKey(League, on_delete=models.CASCADE, null=True)
        location = models.ForeignKey(Location, on_delete=models.CASCADE, null=True)
        members = models.ManyToManyField(User)
    
    # same with ClubRoom
    
  3. Третий вариант, который я могу придумать, - это установить атрибут типа в каждом из ваших подклассов, чтобы вы могли фильтровать room_set по типу нужной вам комнаты.

    class LeagueRoom(Room):
       …
       type = models.CharField(max_length=10, default='league')
       …
    

    Тогда где-то еще:

    room_set.filter(type='league')
    
0 голосов
/ 11 ноября 2018

Вы можете начать с другого конца:

league_rooms = LeagueRoom.objects.filter(members=my_user)
...