gre*_*key 5 python django django-models
在按字段排序时,Django似乎是一个想法。
我需要对两个查询(queryset)进行合并,第一个查询被排名,第二个查询则没有,在最终结果中我想要一个,queryset因为它将被分页。
我将为您提供使用该User模型的示例,以便您可以在家中尝试。
from django.contrib.auth.models import User
from django.db.models import F, Value, IntegerField
from django.db.models.expressions import RawSQL
queryset = User.objects
a = queryset.filter(email__contains='a').annotate(rank=RawSQL("rank() OVER (ORDER BY id desc)", [], output_field=IntegerField()))
b = queryset.filter(email__contains='b').annotate(rank=Value(None, output_field=IntegerField()))
a.union(b).order_by(F('rank').desc(nulls_last=True))
# DatabaseError: ORDER BY term does not match any column in the result set.
a.order_by(F('rank').desc(nulls_last=True))
# this is OK
b.order_by(F('rank').desc(nulls_last=True))
# ProgrammingError: non-integer constant in ORDER BY
# LINE 1: ...ERE "auth_user"."email"::text LIKE '%b%' ORDER BY NULL DESC ...
Run Code Online (Sandbox Code Playgroud)
这是Django错误吗?
我正在使用Django == 1.11.17
我相信这个问题的出现是因为 DjangoValue(None, output_field=IntegerField())仅通过注入来处理NULL,这在子句中是无效的ORDER BY。
然后,因为 Django 将注释的表达式放入 ORDER BY,所以它使用这个值。
我认为克服这个问题的唯一方法是让整个查询(即联合的两个部分)在子查询中进行评估 - 然后子查询将包含注释值的列,而不仅仅是表达式本身。
也许你可能会说这是 django 应该做的,因为它克服了这个问题(也意味着数据库不会多次评估表达式,位于 SELECT 和 WHERE 部分)。
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |