我正在尝试创建具有多个过滤器参数(例如名称,年龄,身高)的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)
值,这是我所不希望的。如果是None
,name='mike'
,age=25
,我只希望过滤器使用height=None
和name
参数,但不包括age
。像这样:
height
这可能吗?还是我需要首先检查每个变量是否存在以及每个可能的过滤器查询是否有不同的情况?
谢谢!
答案 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)