在不使用 API 的情况下,是不是有任何可接受的方式来切割/重组 Django 查询集?

Posted

技术标签:

【中文标题】在不使用 API 的情况下,是不是有任何可接受的方式来切割/重组 Django 查询集?【英文标题】:Is there any acceptable way to chop/recombine Django querysets without using the API?在不使用 API 的情况下,是否有任何可接受的方式来切割/重组 Django 查询集? 【发布时间】:2011-07-20 03:03:24 【问题描述】:

我不得不使用 models.CharField 在我的一个模型中存储一些额外的标志。所以我滥用该领域的每个字母作为标志。例如,“MM5”表示“男性,已婚,50 岁以上”,“FS2”表示“女性,单身,20 岁以上”。

我正在使用方法来查询/访问这些标志。当然,我不能将这些方法与 queryset API 一起使用。我正在使用列表推导调用方法来过滤初始查询集并将它们转换为普通列表,这对于大多数模板馈送来说已经足够了:

people = People.objects.filter(name__startswith='J')  
people_i_want = [p for p in people if p.myflags_ismale() and p.myflags_isolderthan(30)]

那么,有没有什么好的方法可以将这些列表重新转换回查询集?或者根据我的方法的输出截断/过滤查询集,而不首先将其转换为普通列表?

【问题讨论】:

【参考方案1】:

尝试将列表“重新转换”回 QuerySet 可能是不必要的复杂和不好的做法,最好的办法是使用更聪明的 QuerySet 过滤。

您应该使用regex 语法的查询集过滤器来获得您需要的功能。 Documentation here.

例如,使用regex 相当于ismale() 将类似于...

People.objects.filter(myflags__regex=r'.M.') # <-- For matching something like 'MM5'
# Please note I haven't tested this regex expression, but the principal is sound


此外,虽然我承认不是数据库专家,但我相当肯定在 charfield 中使用这种“标志”是一种相当低效的做事方式。

【讨论】:

【参考方案2】:

如果您必须将列表转换回查询集,那么我使用的成语是:

People.objects.filter(pk__in=[x.pk for x in list_of_objects])

显然,这又会影响到数据库。但如果你真的需要的话。

【讨论】:

以上是关于在不使用 API 的情况下,是不是有任何可接受的方式来切割/重组 Django 查询集?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用任何 ID 的情况下从 spotify API 获取艺术家列表

在不使用私有 API 的情况下切换“照亮键盘”

java是不是有任何机制让VM在不使用javaagent等的情况下跟踪自身的方法调用?

如何在不使用java发送任何邮件的情况下检查域中是不是存在电子邮件ID

在不使用 PAT 的情况下验证 Azure Devops Api 调用?

是否有可能在不快速调用 API 的情况下从互联网获取图像?