Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
343 views
in Technique[技术] by (71.8m points)

django多对多有多层时,怎么根据最上层的对象获取最下层的数据

多层级多对多关联的时候,怎么直接通过最顶层拿到最底层的数据啊,比如用户表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 = '菜单表'

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
等待大神解答

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...