Python 如何合并来自同一模型的两个查询集而不对它们排序

Python 如何合并来自同一模型的两个查询集而不对它们排序,python,django,django-queryset,Python,Django,Django Queryset,我已经从同一个模型创建了两个queryset,并将它们合并为一个queryset。但不想对新创建的queryset进行任何排序。我希望我的queryset元素以合并它们的方式列出 queryset1 = modelA.objects.filter(id=modelB.rel_id) queryset2 = modelA.objects.exclude(id=modelB.rel_id) queryset = queryset1 | queryset2 我希望这个项目的产出应该是 query

我已经从同一个模型创建了两个queryset,并将它们合并为一个queryset。但不想对新创建的queryset进行任何排序。我希望我的queryset元素以合并它们的方式列出

queryset1  = modelA.objects.filter(id=modelB.rel_id)
queryset2  = modelA.objects.exclude(id=modelB.rel_id)
queryset = queryset1 | queryset2
我希望这个项目的产出应该是

queryset = <QuerySet [<modelA: YY>, <modelA: XX>, <modelA: ZZ>]>
queryset=
因为modelA:YY是一个queryset1,我将它合并为第一个元素 但结果是:

queryset = <QuerySet [<modelA: XX>, <modelA: YY>, <modelA: ZZ>]>
queryset=
它再次按modelA id排序。即使我没有在modelA和new queryset中设置任何顺序。

您应该在此处使用该函数,如:

queryset = modelA.objects.filter(id=modelB.rel_id).union(
    modelA.objects.exclude(id=modelB.rel_id),
    all=True
)
也就是说,如果要将
modelB.rel\u id
指定为last,可以按如下方式执行:

from django.db.models import BooleanField, ExpressionWrapper, Q

modelA.objects.annotate(
    rel_to_b=ExpressionWrapper(
        Q(id=modelB.rel_id),
        output_field=BooleanField()
    )
).order_by('rel_to_b')

django QuerySet是懒惰的,在必须执行之前不会执行。合并操作只是重写执行的sql以合并这两个查询,而不考虑合并顺序。除非您另行指定,否则默认顺序将生效。如果您想要的只是顶部的特定记录,那么只需获取您想要的id并将其放在排除的查询集结果的顶部即可。或者获取完整集并将其上移到顶部。只需使
queryset=queryset1.exclude()
。。。为什么您首先需要这两个查询集?另外,这两个特定查询集的合并只会是所有实体
from django.db.models import BooleanField, ExpressionWrapper, Q

modelA.objects.annotate(
    rel_to_b=ExpressionWrapper(
        Q(id=modelB.rel_id),
        output_field=BooleanField()
    )
).order_by('rel_to_b')
SELECT model_a.*,
       model_a.id = modelB.rel_id AS rel_to_b
FROM model_a
ORDER BY rel_to_b ASC