如何在模型中过滤对象时在Django中设置默认值

时间:2018-03-23 14:29:42

标签: 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>

注意:我不想编写所有可能的filter语句组合,因为它不方便。

我尝试使用NoneFalse,但结果错误

2 个答案:

答案 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 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)

相同

答案 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可以帮助你。