django xadmin多對多字段過濾(含filter的反向查詢)

要實現的功能: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_dbfieldxadmin內置的函數用來實現多對多過濾,
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_userfilterrelate_name,profile_user__pid=self.user.id指:UserProfile.user=UserUserProfile.pid=self.user.id,實現了我要實現的功能。
相關文章
相關標籤/搜索