django xadmin多对多字段过滤(含filter的反向查询)

要实现的功能:

继昨天实现拓展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_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,程序依然报错

最终采用filter的反向查询实现:

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,实现了我要实现的功能。

 

 
 
 

转载于:https://www.cnblogs.com/ttzz/p/10757015.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值