Django ORM Q 和异步

问题描述 投票:0回答:1

我在 Telegram Bot 中使用 django

如果我需要进行 ORM 查询,我可以那样做

    all_offers = await sync_to_async(Offers.objects.filter, thread_sensitive=True)(
        status      = True,
    )

但我不需要像那样使用 Q 函数进行更困难的查询

    all_offers = await sync_to_async(Offers.objects.filter, thread_sensitive=True)(
        status      = True,
        Q(some_field="1")|Q(another_field=2),
    )

语法错误:位置参数跟随关键字参数

如何解决?

python django asynchronous orm
1个回答
0
投票

如错误所述,您不能将位置参数放在关键字之后,因此您应该将

Q
对象放在第一位:

all_offers = await sync_to_async(Offers.objects.filter, thread_sensitive=True)(
    Q(some_field='1') | Q(another_field=2),
    status=True,
)

然而,使用异步过滤器 not 没有多大意义:

.filter()
是惰性的:这意味着您只异步构造一个
QuerySet
,而不是以异步方式获取记录本身。没有
.afilter(…)
.aannotate(…)
等的原因是因为它们不会生成查询,只会生成一个新的
QuerySet
,最终可能(或不会)进行数据库查询。枚举查询集时,您可以使用
async for

© www.soinside.com 2019 - 2024. All rights reserved.