您的位置:

django出现TypeError("EmptyQuerySet can't be instantiated")的解决方案

  发布时间:2023-03-19 18:00:00
报错的原因当你在 Django 中执行查询操作时,如果返回的结果集为空,Django 会返回一个 `EmptyQuerySet` 对象。这个问题通常是因为你在执行查询操作时没有使用 `.exists()` 或 `.count()` 等方法来判断查询结果是否为空,导致查询结果为空时尝试对 `EmptyQuerySet` 对象进行操作。

报错的原因

当你在 Django 中执行查询操作时,如果返回的结果集为空,Django 会返回一个 `EmptyQuerySet` 对象。如果你试图对这个对象进行操作,就会抛出 `TypeError("EmptyQuerySet can't be instantiated")` 异常。

这个问题通常是因为你在执行查询操作时没有使用 `.exists()` 或 `.count()` 等方法来判断查询结果是否为空,导致查询结果为空时尝试对 `EmptyQuerySet` 对象进行操作。

要解决这个问题,你需要在执行查询操作之前使用 `.exists()` 或 `.count()` 等方法来判断查询结果是否为空,如果为空就可以直接返回,避免对 `EmptyQuerySet` 对象进行操作。

例如:


# 错误的写法
def book_list(request):
    books = Book.objects.filter(author='John')
    if not books:
        return render(request, 'book_list.html', {'books': []})
    return render(request, 'book_list.html', {'books': books})

# 正确的写法
def book_list(request):
    if not Book.objects.filter(author='John').exists():
        return render(request, 'book_list.html', {'books': []})
    books = Book.objects.filter(author='John')
    return render(request, 'book_list.html', {'books': books})

如何解决

要解决 `TypeError("EmptyQuerySet can't be instantiated")` 异常,你需要在执行查询操作之前使用 `.exists()` 或 `.count()` 等方法来判断查询结果是否为空。如果为空,就可以直接返回,避免对 `EmptyQuerySet` 对象进行操作。

例如:


# 错误的写法
def book_list(request):
    books = Book.objects.filter(author='John')
    if not books:
        return render(request, 'book_list.html', {'books': []})
    return render(request, 'book_list.html', {'books': books})

# 正确的写法
def book_list(request):
    if not Book.objects.filter(author='John').exists():
        return render(request, 'book_list.html', {'books': []})
    books = Book.objects.filter(author='John')
    return render(request, 'book_list.html', {'books': books})

此外,你还可以通过使用 `.first()` 或 `.last()` 等方法来避免这个问题,因为这些方法在查询结果为空时会返回 `None`,而不是抛出异常。


def book_list(request):
    book = Book.objects.filter(author='John').first()
    if book is None:
        return render(request, 'book_list.html', {'books': []})
    return render(request, 'book_list.html', {'books': [book]})

使用例子

下面是一个使用 `.exists()` 方法判断查询结果是否为空的例子:


def book_list(request):
    if not Book.objects.filter(author='John').exists():
        # 如果查询结果为空,直接返回
        return render(request, 'book_list.html', {'books': []})

    # 如果查询结果不为空,继续执行后续操作
    books = Book.objects.filter(author='John')
    return render(request, 'book_list.html', {'books': books})

如果你想使用 `.first()` 或 `.last()` 等方法来避免这个问题,可以这样写:


def book_list(request):
    book = Book.objects.filter(author='John').first()
    if book is None:
        # 如果查询结果为空,直接返回
        return render(request, 'book_list.html', {'books': []})

    # 如果查询结果不为空,继续执行后续操作
    return render(request, 'book_list.html', {'books': [book]})

这样就可以避免抛出 `TypeError("EmptyQuerySet can't be instantiated")` 异常了。