Django - 无法按外键 first_name 过滤

Posted

技术标签:

【中文标题】Django - 无法按外键 first_name 过滤【英文标题】:Django - Cannot filter by foreign key first_name 【发布时间】:2018-12-29 05:15:55 【问题描述】:

所以目前我正在这样做,您可以通过first_name, last_name, username的一些过滤器搜索参加活动的用户

目前的错误是

要解压的值太多(预计 2 个)

视图中的错误线:

makefilter = "user__"+searchfilter+"__contains="+searchinput

usersearch = TeamMembership.objects.filter(makefilter)

如何通过过滤器成功搜索?

我的意见.py:

def volunteer(request):
    ## init context
    context = 
    ## Get filters if somes
    searchfilter = request.GET.get('filter', None)
    searchinput = request.GET.get('searchinput', None)
    ## Checks if filter is not none or null or empty
    if searchfilter != "" and searchfilter != None and searchinput != "" and searchinput != None:
        ## Great now check what filter is used
        ## Now strip the filters for whitespaces
        searchfilter.strip()
        searchinput.strip()
        ## This filter is for teams
        if searchfilter == "teamname":
            teamsearch = Team.objects.all().filter(name__contains=searchinput)
            context['teams'] = True
            context['search'] = teamsearch
        ## This filter is for users
        elif searchfilter == "first_name" or searchfilter == "last_name" or searchfilter == "username" or searchfilter == "phone":
            makefilter = "user__"+searchfilter+"__contains="+searchinput
            usersearch = TeamMembership.objects.filter(makefilter)
            context['users'] = True
            context['search'] = usersearch
    return render(request, 'volunteer/hqvolunteer.html', context)

我试图搜索用户模型的模型是标准的 Django 身份验证:

class TeamMembership(models.Model):
    user = models.ForeignKey(User)
    team = models.ForeignKey(Team)
    ingroup = models.BooleanField(default=False)
    leader = models.BooleanField(default=False)
    groupleader = models.BooleanField(default=False)

【问题讨论】:

尝试理解错误的含义。当您尝试在不使用iteritemsitems 的情况下迭代python 字典时,会出现“要解压的值太多”。再次重新读取代码块(查看文件)以检查字典对象的任何此类使用/访问 只有在预期有 2 个元素但返回的元素多于或少于 2 个时才会发生此错误。 【参考方案1】:

这里你只构造了一个字符串,也许它的形状像Python代码,但这不是你将任意参数names传递给函数的方式。 p>

这里可以使用关键字参数,构造一个字典,将key(参数名)映射到value(应与该参数对应的值),例如:

some_dict =  "user__"+searchfilter+"__contains": searchinput

usersearch = TeamMembership.objects.filter(**some_dict)

如果search_filter 是例如'email',而searchinput'bar',那么这将导致some_dict 'user__email__contains': 'bar' ,然后调用:

TeamMembership.objects.filter(** 'user__email__contains': 'bar' )

相当于:

TeamMembership.objects.filter(user__email__contains='bar')

如果你想过滤多个项目,你可以构造一个包含多个键的字典。但请注意,键(如参数名称)不能冲突(调用具有两次或更多相同 named 参数的函数)。

此外请注意,User 模型包含(散列)密码和其他敏感数据,您可能希望避免过滤某些字段,因为可以使用这种机制来破解数据系统。

【讨论】:

非常感谢我之前从未使用外键过滤,所以这个对我来说是新的,当然不是所有字段都可以使用

以上是关于Django - 无法按外键 first_name 过滤的主要内容,如果未能解决你的问题,请参考以下文章

按外键/相关字段分组 django 查询集

Django模型按外键过滤

在 admin 中按外键 id 搜索

使用linq在mvc5中按外键表分组表

如何在 BigQuery 中按外键分组?

按外键和日期分组数据,按日期汇总