要實現的功能:sql
繼昨天實現拓展User模型使其獲得其上級用戶,今天要實現某些模型與用戶多對多字段過濾功能。函數
功能描述:以用戶指派功能爲例,當前用戶將文件指派給多個下級,修改前spa
程序會將全部用戶都顯示出來,修改後,程序只顯示其下級用戶:3d
上代碼:code
#多對多字段過濾 def formfield_for_dbfield(self,db_field,**kwargs): if db_field.name=='assign_units':
kwargs["queryset"]=User.objects.filter(profile_user__pid=self.user.id)
return super(AssignAdmin,self).formfield_for_dbfield(db_field,**kwargs)
formfield_for_dbfield是xadmin內置的函數用來實現多對多過濾,
db_field.name=='assign_units'即在本模型中外鍵的名稱
User.objects.filter(profile_user__pid=self.user.id)過濾條件
最後返回結果。
不多的一段代碼,可是在過濾條件部分折騰了一個上午
因爲實現該查詢要用反向查詢,剛開始使用該語句
kwargs["queryset"]=User.objects.filter(profile_user=self.user.id)
可是查看其sql後發現不是想要的結果,
屢次嘗試無果,想採用利用raw執行原生SQL的方法實現:
sql = "SELECT auth_user.id FROM auth_user INNER JOIN bjra_userprofile ON " \ "(auth_user.id = bjra_userprofile.user_id) WHERE bjra_userprofile.pid_id=%s"%str(self.user.id) kwargs["queryset"]=User.objects.raw(sql)
可是User.objects.raw(sql)返回的是RawQueryset,程序依然報錯orm
最終採用filter的反向查詢實現:blog
User.objects.filter(profile_user__pid=self.user.id)

如圖:profile_user是filter的relate_name,profile_user__pid=self.user.id指:UserProfile.user=User且UserProfile.pid=self.user.id,實現了我要實現的功能。