Django 过滤器查询是否存在过滤器参数
Django filter query if filter parameter exists
我正在尝试创建一个具有多个过滤器参数(例如姓名、年龄、身高)的 Django 过滤器。但是,我只想按参数过滤(如果存在)...
在我的初始化中:
def __init__(self, name=None, age=None, height=None):
self.name = name
self.age = age
self.height = height
在我的查询中:
Person.objects.filter(name=self.name, age=self.age, height=self.height)
但是,问题是由于参数在构造函数中是可选的,过滤器可能正在寻找 None
值,这是我不想要的。如果name='mike'
、age=25
、height=None
,我只希望过滤器使用name
和age
参数并排除height
。类似于:
Person.objects.filter(if self.name: name=self.name, if self.age: age=self.age, if self.height: height=self.height)
这可能吗?或者我是否需要首先检查每个变量是否存在以及每个可能的过滤器查询是否有不同的情况?
谢谢!
from django.db import models as dmodels
filters = dmodels.Q(age=age) & dmodels.Q(name=name)
if height:
filters &= dmodels.Q(height=height)
Person.objects.filter(filters)
如果您想构建一个通用解决方案,请使用Custom model manager
#manager.py
from django.db.models import Manager
class CustomManager(Manager):
<b>def custom_filter(self, *args, **kwargs):
updated_kwargs = {k: v for k, v in kwargs.items() if v is not None}
return super().filter(*args, **updated_kwargs)</b>
将此管理器附加到您的模型中 class 作为,
#models.py
class Person(models.Model):
<b>objects = CustomManager()</b>
# other fields
然后,用这个custom_filter(...)
的方法查询,类似于内置的filter()
# example usage
Person.objects.<b>custom_filter(name=self.name, age=self.age, height=self.height)</b>
注意: 此 custom_filter
方法将省略所有 None
的值
我正在尝试创建一个具有多个过滤器参数(例如姓名、年龄、身高)的 Django 过滤器。但是,我只想按参数过滤(如果存在)...
在我的初始化中:
def __init__(self, name=None, age=None, height=None):
self.name = name
self.age = age
self.height = height
在我的查询中:
Person.objects.filter(name=self.name, age=self.age, height=self.height)
但是,问题是由于参数在构造函数中是可选的,过滤器可能正在寻找 None
值,这是我不想要的。如果name='mike'
、age=25
、height=None
,我只希望过滤器使用name
和age
参数并排除height
。类似于:
Person.objects.filter(if self.name: name=self.name, if self.age: age=self.age, if self.height: height=self.height)
这可能吗?或者我是否需要首先检查每个变量是否存在以及每个可能的过滤器查询是否有不同的情况?
谢谢!
from django.db import models as dmodels
filters = dmodels.Q(age=age) & dmodels.Q(name=name)
if height:
filters &= dmodels.Q(height=height)
Person.objects.filter(filters)
如果您想构建一个通用解决方案,请使用Custom model manager
#manager.py
from django.db.models import Manager
class CustomManager(Manager):
<b>def custom_filter(self, *args, **kwargs):
updated_kwargs = {k: v for k, v in kwargs.items() if v is not None}
return super().filter(*args, **updated_kwargs)</b>
将此管理器附加到您的模型中 class 作为,
#models.py
class Person(models.Model):
<b>objects = CustomManager()</b>
# other fields
然后,用这个custom_filter(...)
的方法查询,类似于内置的filter()
# example usage
Person.objects.<b>custom_filter(name=self.name, age=self.age, height=self.height)</b>
注意: 此 custom_filter
方法将省略所有 None
的值