首页 > 解决方案 > Django 搜索查询功能,如 Django admin 或 Django rest 框架

问题描述

我试图找出一种正确的方法来为我的模型字段(如 Django 的管理员或 Django 休息框架的搜索功能)创建搜索功能。

假设我有这个模型,我想搜索所有字段。:

class User(models.Model):
    email = models.EmailField(
        unique=True,
        max_length=254,
    )
    first_name = models.CharField(max_length=15)
    last_name = models.CharField(max_length=15)
    mobile = models.BigIntegerField(unique=True)

首先,我尝试了这种方式:

user_list = User.objects.filter(
    Q(id__icontains=int(search_input)) |
    Q(email__icontains=search_input) |
    Q(first_name__icontains=search_input) |
    Q(last_name__icontains=search_input) |
    Q(mobile__icontains=int(search_input))
)

如果我只使用整数搜索词进行过滤,这可以正常工作。但是,如果我传递一个字符串值,这会中断并给我一个错误:

ValueError:以 10 为底的 int() 的无效文字

所以现在我想出的是这样的,捕捉任何值错误并从过滤器中排除整数搜索:

try:
    user_list = User.objects.filter(
        Q(id__icontains=int(search_input)) |
        Q(email__icontains=search_input) |
        Q(first_name__icontains=search_input) |
        Q(last_name__icontains=search_input) |
        Q(mobile__icontains=int(search_input))
    )
except ValueError as e:
    user_list = User.objects.filter(
        Q(email__icontains=search_input) |
        Q(first_name__icontains=search_input) |
        Q(last_name__icontains=search_input) |
    )

我希望有比这更好的方法。或者也许是我不知道的字段查找功能?

标签: djangodjango-modelsdjango-queryset

解决方案


您快到了,只需int在查找中删除转换mobile__icontains:它将由 ORM 处理。


推荐阅读