python - 如何在 Django 中设置默认值,同时从模型中过滤对象

标签 python django django-models

我正在尝试创建一个函数,我希望用户输入一些详细信息,并在此基础上我需要过滤掉这些数据并返回它。

例如,如果在我的模型名称配置文件中我有:

名称。年龄,性别,然后我正在尝试做:

Profile.objects.filter(name=name, age=age, gender=gender)

姓名、年龄和性别是由用户提供的值。现在,如果用户输入 name = 'Shashank' 并将年龄和性别留空,那么我需要像这样查询:

Profile.objects.filter(name='Shashank')

同时忽略所有这些空白值。所以我不确定如何实现这种行为。我可以设置什么类型的初始值,这样它就不会影响搜索结果。

Profile.objects.filter(name='Shashank', age=<VALUE>, gender=<VALUE>)

哪里<VALUE>可以被过滤函数忽略。

注意:我不想写所有可能的过滤语句组合,因为这样不方便。

我尝试使用None , False但它给出了错误的结果

最佳答案

您可以为此创建一个管理器方法。

class ProfileManager(models.Manager):
    def myfilter(self, **filters):
        filters = {k:v for k,v in filters.items() if v is not None}
        qs = self.get_queryset()
        return qs.filter(**filters)

一定要在模型中设置管理器

class Profile(models.Model):
    objects = ProfileManager()
    # the rest of the model

然后您可以将 name agegender (或任何其他列)传递给 objects.myfilter 并它将忽略任何 None 值。

# assume the following values are retrieved
# name = 'Shashank'
# age = None
# gender = None

qs = Profile.objects.myfilter(name=name, age=age, gender=gender)

这里的qs应该与objects.filter(name=name)相同

关于python - 如何在 Django 中设置默认值,同时从模型中过滤对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49451987/

相关文章:

django - Django get_prep_value() 中的自定义字段无效

django - 为什么 Abstract=True 不在 django 模型的 Meta 类中继承

python - 查询范围为2年的DateField

具有多个可变长度元素的Python列表理解?

python - 为什么计算方法只适用于一条记录?

python - 从 MySQL 控制台查看 Django 用户表

Django rest 框架发送带单引号的字符串而不是带双引号的 JSON

python - 如何在Django中接收存储过程Oracle的输出参数(sys_refcursor)

python - 如何查找列表中元素的所有出现?

python - 如何在 Python 中从多个列表创建字典