1. 程式人生 > 實用技巧 >Django ORM之ManyToMany反向查詢報錯

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)