Django合并2个查询集而不改变原来的顺序

osh3o9ms  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(108)
def get_queryset(self):
    normal_posts = Post.objects.filter(field1='value1').order_by('another_field_1')
    featured_posts = Post.objects.filter(field2='value2').order_by('another_field_2')
        
    all_posts = (normal_posts | featured_posts) #does not preserve the order
    return all_posts

我使用DjangoFilterBackend和filterset_class来处理分页查询结果。因此无法在下面使用。

normal_posts.union(featured_posts) #django.db.utils.NotSupportedError: Calling QuerySet.filter() after union() is not supported.

我也尝试使用itertools import chain中的,但是它没有多大帮助,因为它返回的是列表而不是查询集。
请建议。

vnjpjtjt

vnjpjtjt1#

为了允许每个过滤器在合并两个过滤器时都有自己的order选项,您可以将此answer修改为一个非常类似的问题,并基于实际的queryset过滤器添加一个额外的注解,并将其用作order_by的辅助键:

normal_posts = Q(field1='value1')
featured_posts = Q(field2='value2')
all_posts = (
    Post.objects
    .filter(normal_posts| featured_posts)
    .annotate(
        post_type=Case(
            When(normal_posts, then=Value(1)),
            When(featured_posts, then=Value(2)),
            output_field=IntegerField(),
        )
    )
    .annotate(
        type_specific_ordering=Case(
            When(normal_posts, then=F('another_field_1')),
            When(featured_posts, then=F('another_field_2'))
        )
    )
    .order_by('post_type', 'type_specific_ordering')
)

相关问题