Python 如何在Django中设置默认值,同时从模型中筛选对象

Python 如何在Django中设置默认值,同时从模型中筛选对象,python,django,django-models,Python,Django,Django Models,我正在尝试创建一个函数,我希望用户输入一些细节,在此基础上,我需要过滤掉这些数据并返回它 例如,如果在我的型号名称配置文件中,我有: 名字。年龄,性别那么我要做的是: Profile.objects.filter(name=name,age=age,gender=gender) 姓名、年龄和性别是由用户提供的值。现在,如果用户键入name='Shashank'并将年龄和性别留空,那么我需要像这样查询它: Profile.objects.filter(name='Shashank') 而忽略所有这

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

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

名字。年龄,性别那么我要做的是:

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

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

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

而忽略所有这些空白值。因此,我不知道如何实现这种行为。我可以设置什么类型的初始值,使其不会影响搜索结果

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

其中,
可被过滤器功能忽略

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


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

可能不是最佳解决方案,但我是这样做的:在检查值是否为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)

或者可以帮助您。

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

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
然后您可以将
姓名
年龄和
性别
(或任何其他列)传递给
对象。myfilter
将忽略
的任何值

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

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

这里的qs应该与
对象相同。filter(name=name)

您好,谢谢您的回答,它确实帮助了我很多,是的,它正在按预期工作。仅供参考,也可以使用django filter应用程序进行操作,对吗?因为那是我最后的选择,但现在它已经被修复了。我不确定它是否有现成的功能,但看看文档,它似乎支持,因此,看起来你可以使用该功能以这种方式应用与上述相同的解决方案。如果有数以百万计的配置文件数据,我获取所有对象,然后开始过滤它呢。用这种方法可以吗?这真是一个很好的解决方案。@ShashankSharma是的,你是对的,如果你有很多属性要过滤,这个解决方案是不可行的。但是,由于,您可以过滤一些属性,而不会产生糟糕的数据库性能。