要實現的功能:
繼昨天實現拓展User模型使其得到其上級用戶,今天要實現某些模型與用戶多對多字段過濾功能。
功能描述:以用戶指派功能為例,當前用戶將文件指派給多個下級,修改前
程序會將所有用戶都顯示出來,修改后,程序只顯示其下級用戶:
上代碼:
#多對多字段過濾 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,程序依然報錯
最終采用filter的反向查詢實現:
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,實現了我要實現的功能。