gpt4 book ai didi

python - Django ORM : Filter results by values from list, 每个值限制答案?

转载 作者:行者123 更新时间:2023-12-01 01:44:40 25 4
gpt4 key购买 nike

我正在使用 Django 2.0,并且有一个带有外键(User,...)的内容模型。我还有一个用户 ID 列表,我想为其获取该内容,按“最新的优先”排序,但每个用户最多只能包含 25 个元素。我知道我可以做到这一点:

Content.objects.filter(user_id__in=[1, 2, 3, ...]).order_by('-id')

...获取每个用户创建的所有内容对象,另外我将首先使用最新元素对其进行排序。但我想为每个用户获取最多 25 个元素(有些用户可能会创建数百个这样的对象,有些可能会创建零个)。当然还有愚蠢的方法:

for user in [1, 2, 3, ...]:
Content.objects.filter(user_id=user).order_by('-id')[:25]

然而,这会访问数据库的次数与用户 ID 列表中对象的次数一样多,而且访问次数相当高(每个页面 View 大约 100 次左右)。有什么办法可以优化这个案例吗? (我尝试查看 select_lated,但这似乎会获取尽可能多的相关模型。)

最佳答案

有很多方法可以形成 查询,但在这种情况下,您可以形成所有用户的前 n 个查询的并集:

contents = Content.objects.\
none().\
union(*[Content.objects.
filter(user_id=uid).
order_by('-id')[:25] for uid in user_ids],
all=True)

使用prefetch_related()然后,您可以生成一个查询集来获取用户并注入(inject)最新内容的属性:

users = User.objects.\
filter(id__in=user_ids).\
prefetch_related(models.Prefetch(
'content_set',
queryset=contents,
to_attr='latest_content'))

关于python - Django ORM : Filter results by values from list, 每个值限制答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51509141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com