您的位置:

解决ValueError("Window.order_by must be either a string reference to a ""field, an expression, or a list or tuple of them.")在django出现报错

  发布时间:2023-03-05 12:00:36
报错的原因这个错误通常是由于在使用 Django 的 `Window` 对象的 `order_by` 参数时传递了一个无效的值。`order_by` 参数必须是一个字符串引用的字段、一个表达式或一个字段的列表或元组。举个例子,以下代码可能会导致此错误要解决此错误,请确保传递给 `order_by` 参数的值是有效的。我们使用 `Sum` 函数来求和 `amount` 字段的值,并使用 `F` 对象来按照 `id` 字段的升序排序。最后,我们使用 `annotate` 方法将窗口函数添加到查询集中。这会为每个记录添加一个新的字段 `running_total`,其中包含该记录的运行总和。

报错的原因

这个错误通常是由于在使用 Django 的 `Window` 对象的 `order_by` 参数时传递了一个无效的值。

`order_by` 参数必须是一个字符串引用的字段、一个表达式或一个字段的列表或元组。如果您传递了一个其他类型的值,则可能会看到此错误。

举个例子,以下代码可能会导致此错误:


from django.db.models.functions import Window

# Incorrect: order_by must be a string reference to a field, an expression, or a list or tuple of them
my_window = Window(order_by=1234)

要解决此错误,请确保传递给 `order_by` 参数的值是有效的。例如,下面的代码是正确的:


from django.db.models.functions import Window

# Correct: order_by is a string reference to a field
my_window = Window(order_by='my_field')

# Correct: order_by is an expression
from django.db.models import F
my_window = Window(order_by=F('my_field') * 2)

# Correct: order_by is a list of fields
my_window = Window(order_by=['field1', 'field2'])

如何解决

为了解决 "Window.order_by must be either a string reference to a field, an expression, or a list or tuple of them" 这个错误,您需要确保传递给 `order_by` 参数的值是有效的。

有效的值可以是一个字符串引用的字段、一个表达式或一个字段的列表或元组。如果您传递了一个无效的值,您会看到这个错误。

举个例子,以下代码可能会导致此错误:


from django.db.models.functions import Window

# Incorrect: order_by must be a string reference to a field, an expression, or a list or tuple of them
my_window = Window(order_by=1234)

要解决这个问题,您需要确保传递给 `order_by` 参数的值是有效的。例如,下面的代码是正确的:


from django.db.models.functions import Window

# Correct: order_by is a string reference to a field
my_window = Window(order_by='my_field')

# Correct: order_by is an expression
from django.db.models import F
my_window = Window(order_by=F('my_field') * 2)

# Correct: order_by is a list of fields
my_window = Window(order_by=['field1', 'field2'])

如果您还有其他问题,请继续提问。

使用例子

是的,这里有一个使用 Django 的 `Window` 对象的例子:


from django.db.models import Sum, F, Window

# Calculate the running total for each record in the queryset
# The running total is calculated by summing the values of the "amount" field
# for each record, starting from the first record
qs = MyModel.objects.annotate(
    running_total=Window(
        expression=Sum('amount'),
        order_by=F('id').asc()
    )
)

# Now the "running_total" field will contain the running total for each record
# For example:
# record 1: running_total = amount
# record 2: running_total = amount1 + amount2
# record 3: running_total = amount1 + amount2 + amount3
# etc.

在这个例子中,我们使用 `Window` 对象来计算每个记录的运行总和。我们使用 `Sum` 函数来求和 `amount` 字段的值,并使用 `F` 对象来按照 `id` 字段的升序排序。

最后,我们使用 `annotate` 方法将窗口函数添加到查询集中。这会为每个记录添加一个新的字段 `running_total`,其中包含该记录的运行总和。

希望这个例子能帮助您了解如何使用 Django 的 `Window` 对象。如果您有其他问题,请让我知道。