Django ORM之ManyToMany反向查询报错

一、创建数据表:其中UserRole_MTM是多对多关系表

class Role(models.Model):
    title=models.CharField(verbose_name='角色名称',max_length=32)
    permission=models.ManyToManyField(verbose_name='拥有的所有权限',to='Permission',blank=True)
    # def __str__(self):
    #     return self.title
class UserInfo(models.Model):
    eid = models.CharField(verbose_name='用户编码', max_length=7,unique=True)
    username=models.CharField(verbose_name='用户名',max_length=32)
    email=models.CharField(verbose_name='邮箱',max_length=32)
    password = models.CharField(verbose_name='密码', max_length=64)
    roles=models.ManyToManyField(                 # 通过已经创建的关系表创建多对多关系。
        verbose_name='拥有的所有角色',
        to='Role',
        through='UserRole_MTM',
        through_fields=('ug_user','ug_role'),
        blank=True,
        symmetrical=False,
    )

class UserRole_MTM(models.Model):
    ug_user=models.ForeignKey('UserInfo')
    ug_role=models.ForeignKey('Role')
    class Meta:
        unique_together = [
            ('ug_user','ug_role'),
        ]

二、在views.py中使用_set进行反向查询Role表中的title数据

class user_role_ORM(View):
    def get(self,request):
        result=models.UserInfo.objects.filter(eid='E100002').first()
        mm=result.userrole_mtm_set.all()
        for row in mm:
            print(row.ug_role_id.title)
        return render(request,'app01_rbac_ORM.html',{'obj':obj})

由于使用row.ug_role_id.title进行反向查询错误语法,出现报错

  File "D:\views\business_logic.py", line 23, in get
    print(row.ug_role_id.title)
AttributeError: 'int' object has no attribute 'title'

所以在反向查询时,不能直接使用数据表的字段名,而要使用在models.py中定义关系时的变量名来构造查询条件

print(row.ug_role.title)

 

上一篇:回调函数Callbacks


下一篇:rbac组件之数据库设计(一)