django models:获取id列表

iba*_*uio 58 sql django django-models

如何获取表的所有id/primary键列表.说我有这张桌子:

class Blog(models.Model)
  title = models.CharField()
  body = models.CharField()
  author = models.ForeignKey(Author)
Run Code Online (Sandbox Code Playgroud)

假设字段作者是Author对象.我想得到Blog = author的所有博客

我知道我可以使用

    blogs = Blog.objects.filter(author=author)
Run Code Online (Sandbox Code Playgroud)

并以列表形式获取所有博客对象,但我如何获得列表IDS/PK?类似于"从作者=作者的博客中选择ID"

Ste*_*yan 98

您可以使用values_list方法执行此操作.

blogs = Blog.objects.filter(author=author).values_list('id', flat=True)
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅django queryset文档.

  • 有没有办法在不解析返回查询集的情况下获取这些ID?我得到 <QuerySet [13, 14, 15]> 并且我想要那个 id 列表。有什么Python式的方法可以避免迭代行吗? (3认同)
  • list 方法获取 ids 而不解析返回的查询集。打印(列表(id)) (3认同)

And*_*ter 61

Blog.objects.filter(author=author).values_list('id', flat=True)
Run Code Online (Sandbox Code Playgroud)

values_list()给出一个行列表,每行按顺序指定为参数指定的所有字段的元组.如果只将一个字段作为参数传递,则还可以指定flat=True获取普通列表而不是元组列表.

  • 最好使用`pk`而不是`id`,内部值`pk`将始终指向主键字段,即使它不被称为"id". (18认同)

小智 8

Blog.objects.filter(author=author).values_list('pk', flat=True)
Run Code Online (Sandbox Code Playgroud)

pk代替id,只是最佳实践。


Sah*_*yed 6

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))
Run Code Online (Sandbox Code Playgroud)