繁体   English   中英

在Django中访问超类方法

[英]Accessing super class methods in django

我有以下模型,一个用户

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。 有人可以帮我弄这个吗?

您可以从另一端开始:

league_rooms = LeagueRoom.objects.filter(members=my_user)
  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不能是抽象类,则必须将Member字段从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. 我想到的第三个选择是在每个子类上设置type属性,以便可以将room_set过滤为所需的房间类型。

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

    然后在其他地方:

     room_set.filter(type='league') 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM