django模型:获取ID列表


77

我如何获取表的所有ID /主键的列表。说我有这张桌子:

class Blog(models.Model)
  title = models.CharField()
  body = models.CharField()
  author = models.ForeignKey(Author)

假定字段作者是Author对象。我想获得所有Blog的ID,其中author = author

我知道我可以用

    blogs = Blog.objects.filter(author=author)

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


我很好奇你为什么想要这个?通常,您不处理由django管理的主键。
Burhan Khalid'3

@burhan有点复杂,我需要使用PK / ID列表进行另一个查询,w / c类似于not_authored_blog = Author.objects.exclude(blog__id__in=blogs)。我有另一个表,其中有FK来“博客”,并且想要在“博客”中不是FK的另一个表中获取对象。比这还复杂的多
ibaguio 2014年

您可以通过检查blog_set相关经理是否有任何记录来解决此问题;如果为空,则该作者没有博客。这将比执行排除查询更好,后者可能会翻译成较大的NOT IN子句。
Burhan Khalid 2014年

Answers:


134

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

blogs = Blog.objects.filter(author=author).values_list('id', flat=True)

有关更多信息,请参见Django queryset文档


1
有什么方法可以在不解析返回的查询集的情况下获取这些ID?我得到<QuerySet [13,14,15]>,我想要该ID列表。有什么pythonic的方法可以避免对行进行迭代?
RuBiCK

list方法获取ID而不解析返回的查询集。print(list(ids))
Sahir Saiyed

64
Blog.objects.filter(author=author).values_list('id', flat=True)

values_list()给出行的列表,每行依次列出您指定为参数的所有字段的元组。如果仅将单个字段作为参数传递,则还可以指定flat=True获取纯列表而不是元组列表。


22
最好使用pk代替id,内部值pk将始终指向主键字段,即使其未称为“ id”。
Burhan Khalid'3


0

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))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.