多层级多对多关联的时候,怎么直接通过最顶层拿到最底层的数据啊,比如用户表User
多对多关联角色表Role
,角色表Role
又多对多关联菜单表Menu
,我怎么直接根据user
对象拿到所有的menu
并序列化出来返回给前端。我目前在user model
里面实现了根据当前user
对象获取所有role
的方法roles()
,并在role model
里面实现了根据当前role
对象获取所有菜单的方法menus()
,那我怎么根据user
对象直接获取所有菜单呢,在user model
里怎么实现?
我试过先查出所有的roles
,然后遍历role
出来,再通过role
去获取所有的menus
,最终把所有的menus
放在一个list
里面,但是这个操作一点都不美观,我最种拿到的数据是一个普通的list
,而不是queryset
,无法序列化,不知道django
里面有没有黑科技完成这种事情,请求大神解答
class UserInfo(models.Model):
uid = models.CharField(max_length=32, unique=True, default=gen_id)
username = models.CharField(max_length=32, unique=True)
password = models.CharField(max_length=256, blank=False, null=False)
status = models.IntegerField(default=1)
create_time = models.DateTimeField(default=now)
update_time = models.DateTimeField(default=now)
class Meta:
db_table = 'user'
def roles(self):
"""
反查当前用户所有角色列表
:return:
"""
roles = self.role_set.all()
if len(roles) > 0:
return roles
return []
class Role(models.Model):
role_code = models.CharField(max_length=10, unique=True, null=False)
role_name = models.CharField(max_length=10, unique=True, null=False)
role_desc = models.CharField(max_length=50, null=False)
status = models.IntegerField(default=1)
users = models.ManyToManyField(UserInfo)
class Meta:
db_table = 'role'
verbose_name = '角色表'
verbose_name_plural = '角色表'
def menus(self):
menus = self.menu_set.all()
if len(menus) > 0:
return menus
return []
class Menu(models.Model):
name = models.CharField(max_length=10, unique=True, null=False)
icon_class = models.CharField(max_length=10, null=True)
status = models.IntegerField(default=1)
roles = models.ManyToManyField(Role)
class Meta:
db_table = 'menu'
verbose_name = '菜单表'
verbose_name_plural = '菜单表'