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?我得到 并且我想要那个 id 列表。有什么pythonic方法可以避免遍历行吗? list 方法在不解析返回的查询集的情况下获取 id。打印(列表(ids))【参考方案2】:
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列表的主要内容,如果未能解决你的问题,请参考以下文章

Django - 在 render_change_form (ModelAdmin) 中获取对象 ID

如何从 django 模型中获取 ID

如何从列表中的 django 模型中获取选择字段?

Django获取模型属性列表的最佳方式

python Django:获取一个模型的字段列表

django:为啥在模板中获取模型的 .id 字段很慢?