【问题标题】:objects.filter() and Foreign Key NULLobjects.filter() 和外键 NULL
【发布时间】:2012-07-14 17:43:28
【问题描述】:

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

感谢您提供解决此问题的每一个提示。

【问题讨论】:

    标签: python django null foreign-keys


    【解决方案1】:

    你可以这样写:

    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

    【讨论】:

    • 感谢您的回答西蒙。我在这里找到了一个类似的解决方案:[link]nomadjourney.com/2009/04/dynamic-django-queries-with-kwargs 是的,这是有效的。但这是很多工作,所以我希望做一些简单的事情:-)
    • 另外,只是想提一下 QuerySet 对象可以被链接。所以写这个的另一种选择是说:results = student.objects.filter(FOO) 然后测试一些东西并说:results = results.filter(BAR)。当您的所有条件位可能并非全部都是过滤器时,它会很有帮助......有些可能会导致限制或其他查询方法。
    猜你喜欢
    • 2018-07-14
    • 2021-10-28
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多