我正在尝试创建一个函数,我希望用户输入一些细节,并根据我需要过滤掉这些数据并将其返回。
例如,如果在我的模型名称中,我有:
名称。年龄,性别然后我想做:
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>
。
注意:我不想编写所有可能的filter语句组合,因为它不方便。
我尝试使用None
,False
,但结果错误
答案 0 :(得分:7)
您可以为此制作经理方法。
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)
答案 1 :(得分:2)
可能不是最好的解决方案,但我已经这样做了:在检查值是否为None时链接过滤器。
qs = Profile.objects.all()
if name:
qs = qs.filter(name=name)
if age:
qs = qs.filter(age=age)
if gender:
qs = qs.filter(gender=gender)
或者this answer可以帮助你。