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

Sha*_*rma 3 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语句组合,因为它不方便.

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

syt*_*ech 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)
Run Code Online (Sandbox Code Playgroud)

务必在模型中设置管理器

class Profile(models.Model):
    objects = ProfileManager()
    # the rest of the model
Run Code Online (Sandbox Code Playgroud)

然后你可以传递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)
Run Code Online (Sandbox Code Playgroud)

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