要实现的功能:
继昨天实现拓展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,实现了我要实现的功能。