Django过滤器查询是否存在过滤器参数

时间:2019-12-19 16:30:44

标签: python django django-models django-filters

我正在尝试创建具有多个过滤器参数(例如名称,年龄,身高)的django过滤器。但是,我只想按存在的参数进行过滤...

在我的初始化中:

module.exports = {
  theme: {
    fontFamily: {
      base: ["Quicksand", "sans-serif"],
      title: ["Belgrano", "serif"]
    },
    extend: {},
    boxShadow: {
      menu: "0 3px 5px rgba(0,0,0,0.2)"
    }
  },
  variants: {},
  plugins: []
};

在我的查询中:

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) 值,这是我所不希望的。如果是Nonename='mike'age=25,我只希望过滤器使用height=Nonename参数,但不包括age。像这样:

height

这可能吗?还是我需要首先检查每个变量是否存在以及每个可能的过滤器查询是否有不同的情况?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果要构建 通用解决方案 ,请使用Custom model manager

#manager.py
from django.db.models import Manager


class CustomManager(Manager):
    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)

将此管理员添加为模型类,

#models.py
class Person(models.Model):
    objects = CustomManager()
    # other fields

然后,使用此 custom_filter(...) 方法进行查询,类似于内置的 filter()

# example usage
Person.objects.custom_filter(name=self.name, age=self.age, height=self.height)

注意::此 custom_filter 方法将忽略所有 None 的值

答案 1 :(得分:-1)

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