我正在尝试创建一个函数,我希望用户输入一些详细信息,并在此基础上我需要过滤掉这些数据并返回它。
例如,如果在我的模型名称配置文件中我有:
名称。年龄,性别,然后我正在尝试做:
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
age
和 gender
(或任何其他列)传递给 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/