我在Django写了一个复杂的搜索表单。
这是我的示例模型:
class student(models.Model):
name = models.CharField(max_length=255)
school = models.ForeignKey('school', null=True, blank=True)
class school(models.Model):
name = models.CharField(max_length=255)
所以学生使用FK上学。它应该是可选的,因此使用null=True
和blank=True
。如果我想搜索具有特定学校名称的学生,我会使用带有HTML代码的表单:
<input type="text" name="school_name"/>
我这样查询数据库(例子):
def search(request):
results = student.objects.filter(
name__icontains=request.POST.get('student_name',''),
school__name__icontains=request.POST.get('school_name','')
)
问题是: 如果我将搜索表单留空,则应显示所有学生,因为未应用过滤器。如果每个学生都设置了一所学校,这就有用。 如果学生没有学校设置,那么它在MySQL中的值是'NULL'。我假设找不到它们,因为空字符串不是NULL。但是我怎么能避免这种情况呢?我是否必须在每个过滤表达式之前编写if语句?我们谈论50-100个字段来过滤!
我要感谢每一个解决这个问题的提示。
答案 0 :(得分:2)
你可以这样写:
query = {
'name__icontains': request.POST.get('student_name',''),
}
school_name = request.POST.get('school_name', None)
if school_name is not None:
query['school__name__icontains'] = school_name
results = student.objects.filter(**query)
同样适用于其他领域。这意味着每个字段都有一个if语句。您甚至可以动态执行此操作,因为query
中的键只是字符串。这意味着您也可以计算它们,并在需要时将它们添加到query
。