zoukankan      html  css  js  c++  java
  • 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,实现了我要实现的功能。
    
    
     
  • 相关阅读:
    viewport
    Flex 布局教程
    鼠标放上去盒子向上滑动
    鼠标放图片上,原图上划上去一个透明图片
    类加载过程
    JVM入门
    redis简介和安装
    JMH和Disruport
    线程池
    JUC
  • 原文地址:https://www.cnblogs.com/ttzz/p/10757015.html
Copyright © 2011-2022 走看看