django模型:获取id列表
Posted
技术标签:
【中文标题】django模型:获取id列表【英文标题】:django models: get list of id 【发布时间】:2014-04-03 04:33:28 【问题描述】:如何获取表的所有 id/主键列表。假设我有这张桌子:
class Blog(models.Model)
title = models.CharField()
body = models.CharField()
author = models.ForeignKey(Author)
假设字段 author 是 Author 对象。我想获取作者=作者的博客的所有 id
我知道我可以使用
blogs = Blog.objects.filter(author=author)
并以列表形式获取所有博客对象,但是如何获取列表 IDS/PK?类似于“Select id from Blog where Author=author”
【问题讨论】:
我很好奇你为什么要这个?通常你不会处理由 django 管理的主键。 @burhan 有点复杂,我需要使用 PK/ID 列表进行另一个查询,w/c 类似于not_authored_blog = Author.objects.exclude(blog__id__in=blogs)
。我有另一个表,该表具有“博客”的 FK,并且想要获取另一个表中的对象,该表不是“博客”中的 FK。虽然比这更复杂
您可以通过检查blog_set
相关经理是否有任何记录来解决此问题;如果它是空的,那么这个作者没有博客。这将比执行您的排除查询要好得多,排除查询可能被翻译为一个大的NOT IN
子句。
【参考方案1】:
您可以使用values_list
方法来做到这一点。
blogs = Blog.objects.filter(author=author).values_list('id', flat=True)
在Django queryset documentation 上查看更多信息。
【讨论】:
有没有办法在不解析返回的查询集的情况下获取这些 id?我得到Blog.objects.filter(author=author).values_list('id', flat=True)
values_list()
给出一个行列表,每一行是你指定为参数的所有字段的元组,按顺序排列。如果您仅将单个字段作为参数传入,您还可以指定 flat=True
以获取普通列表而不是元组列表。
【讨论】:
最好使用pk
而不是id
,内部值pk
将始终指向主键字段,即使它不称为“id”。【参考方案3】:
Blog.objects.filter(author=author).values_list('pk', flat=True)
使用pk
代替id
,只是为了获得最佳实践。
【讨论】:
【参考方案4】:values_list
它在迭代时返回元组。每个元组都包含来自各个字段或表达式的值,这些值被传递到 values_list()。
author = Blog.objects.filter(author=author)
ids = author.values_list('pk', flat=True)
# list method get ids without parse the returning queryset
print(list(ids))
【讨论】:
以上是关于django模型:获取id列表的主要内容,如果未能解决你的问题,请参考以下文章