objects.filter()和外键NULL

时间:2012-06-20 18:57:35

标签: python django null foreign-keys

我在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个字段来过滤!

我要感谢每一个解决这个问题的提示。

1 个答案:

答案 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