• 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,实现了我要实现的功能。
    
    
     
  • 相关阅读:
    LeeCode(两数相加)
    Linux vim中移动显示横线
    JAVA各版本的区别
    LNMP一键包安装完成后的目录结构
    tp6打开和关闭调试的方式
    windows安装Thinkphp6的过程
    Composer 的安装方法(一)
    解决:libsodium-1.0.17安装失败
    有些国内的安卓APP下载不了的解决办法
    Linux 安装时不能下载的问题处理办法
  • 原文地址:https://www.cnblogs.com/ttzz/p/10757015.html
Copyright © 2020-2023  润新知