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=25height=None,我只希望过滤器使用nameage参数并排除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)

see here

如果您想构建一个通用解决方案,请使用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 的值