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

发布于 2022-09-12 03:24:14 字数 2323 浏览 23 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文