您的位置:

对于django错误ValueError("Subqueries aren't allowed across different databases. Force ""the inner query to be evaluated using `list(inner_query)`.")的解决

  发布时间:2023-03-17 18:01:58
报错的原因这个错误通常是由于你在使用 Django ORM 时尝试在不同的数据库之间使用子查询导致的。但是,Django 默认不允许在不同的数据库之间使用子查询。使用 list() 函数在 InnerModel 中查询 field 值为 'foo' 的记录在 OuterModel 中查询与 inner_query 中的记录关联的记录这里会抛出使用 list() 函数将 inner_query 转换为 Python 列表现在可以使用 inner_query 了使用 Subquery() 函数在 InnerModel 中查询 field 值为 'foo' 的记录在 OuterModel 中查询与 inner_query 中的记录关联的记录使用 Subquery() 函数嵌套子查询希望这些例子能帮助你。

报错的原因

"ValueError("Subqueries aren't allowed across different databases. Force the inner query to be evaluated using `list(inner_query)`.")" 这个错误通常是由于你在使用 Django ORM 时尝试在不同的数据库之间使用子查询(subquery)导致的。

子查询是一种在查询中嵌套另一个查询的方法,它可以帮助你组合复杂的查询。例如,你可以使用子查询来查找最大值、最小值、平均值、中位数等。

但是,Django 默认不允许在不同的数据库之间使用子查询。原因是,子查询可能会在不同的数据库之间跨越多个连接,这可能会导致性能问题、安全问题等。

为了解决这个错误,你需要避免在不同的数据库之间使用子查询,或者使用 Django ORM 提供的特殊方法将子查询强制在同一数据库中执行。例如,你可以使用 list() 函数将子查询转换为 Python 列表,然后再执行查询:


# 将子查询转换

如果你想在不同的数据库之间使用子查询,可以使用 Django ORM 提供的特殊方法将子查询强制在同一数据库中执行。例如,你可以使用 list() 函数将子查询转换为 Python 列表,然后再执行查询:


# 将子查询转换为 Python 列表
inner_query = list(inner_query)

# 现在可以使用 inner_query 了
results = outer_query.filter(field__in=inner_query)

另一种解决方案是使用 Django ORM 提供的 Subquery() 函数。这个函数允许你在查询中嵌套另一个查询,并且可以将子查询作为输出的查询字段。例如:


from django.db.models import Subquery

# 使用 Subquery() 函数嵌套子查询
results = outer_query.filter(field__in=Subquery(inner_query))

这些解决方案中的任意一种都可以帮助你解决 "ValueError("Subqueries aren't allowed across different databases. Force the inner query to be evaluated using `list(inner_query)`.")" 这个错误。

希望这些信息能帮助你。

如何解决

为了解决 "ValueError("Subqueries aren't allowed across different databases. Force the inner query to be evaluated using `list(inner_query)`.")" 这个错误,你需要避免在不同的数据库之间使用子查询,或者使用 Django ORM 提供的特殊方法将子查询强制在同一数据库中执行。

有两种常见的解决方案:

1. 使用 list() 函数将子查询转换为 Python 列表:


# 将子查询转换为 Python 列表
inner_query = list(inner_query)

# 现在可以使用 inner_query 了
results = outer_query.filter(field__in=inner_query)

2. 使用 Django ORM 提供的 Subquery() 函数:


from django.db.models import Subquery

# 使用 Subquery() 函数嵌套子查询
results = outer_query.filter(field__in=Subquery(inner_query))

这些解决方案中的任意一种都可以帮助你解决 "ValueError("Subqueries aren't allowed across different databases. Force the inner query to be evaluated using `list(inner_query)`.")" 这个错误。

希望这些信息能帮助你。

使用例子

以下是两个使用 list() 函数和 Subquery() 函数分别解决 "ValueError("Subqueries aren't allowed across different databases. Force the inner query to be evaluated using `list(inner_query)`.")" 错误的例子。

使用 list() 函数:


from django.db import models

class OuterModel(models.Model):
    field = models.CharField(max_length=255)

class InnerModel(models.Model):
    outer = models.ForeignKey(OuterModel, on_delete=models.CASCADE)
    field = models.CharField(max_length=255)

# 在 InnerModel 中查询 field 值为 'foo' 的记录
inner_query = InnerModel.objects.filter(field='foo')

# 在 OuterModel 中查询与 inner_query 中的记录关联的记录
outer_query = OuterModel.objects.filter(inner__in=inner_query)

# 这里会抛出 ValueError("Subqueries aren't allowed across different databases. Force the inner query to be evaluated using `list(inner_query)`.")

# 使用 list() 函数将 inner_query 转换为 Python 列表
inner_query = list(inner_query)

# 现在可以使用 inner_query 了
results = outer_query.filter(inner__in=inner_query)

使用 Subquery() 函数:


from django.db import models
from django.db.models import Subquery

class OuterModel(models.Model):
    field = models.CharField(max_length=255)

class InnerModel(models.Model):
    outer = models.ForeignKey(OuterModel, on_delete=models.CASCADE)
    field = models.CharField(max_length=255)

# 在 InnerModel 中查询 field 值为 'foo' 的记录
inner_query = InnerModel.objects.filter(field='foo')

# 在 OuterModel 中查询与 inner_query 中的记录关联的记录
outer_query = OuterModel.objects.filter(inner__in=Subquery(inner_query))

# 使用 Subquery() 函数嵌套子查询
results = outer_query.filter(inner__in=Subquery(inner_query))

希望这些例子能帮助你。