1

我在 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=Trueblank=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 个字段!

我会感谢每一个提示来解决这个问题。

4

1 回答 1

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在需要时添加它们。

于 2012-06-20T19:03:56.960 回答