ChatGPT解决这个技术问题 Extra ChatGPT

django模型:获取id列表

如何获取表的所有 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?类似于“从作者=作者的博客中选择 id”

我很好奇你为什么要这个?通常你不处理主键,因为它由 django 管理。
@burhan 有点复杂,我需要使用 PK/ID 列表进行另一个查询,w/c 类似于 not_authored_blog = Author.objects.exclude(blog__id__in=blogs)。我有另一个表,该表具有“博客”的 FK,并且想要获取另一个表中的对象,该表不是“博客”中的 FK。虽然比这更复杂
您可以通过检查 blog_set 相关经理是否有任何记录来解决此问题;如果它是空的,那么这个作者没有博客。这将比执行您的排除查询要好得多,后者可能被翻译为一个大的 NOT IN 子句。

p
phoenix

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

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

Django queryset documentation 中查看更多信息。


有没有办法在不解析返回的查询集的情况下获取这些 ID?我得到 并且我想要那个 id 列表。是否有任何避免迭代行的pythonic方法?
list 方法在不解析返回的查询集的情况下获取 id。打印(列表(ID))
A
Andrew Gorcester
Blog.objects.filter(author=author).values_list('id', flat=True)

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


最好使用 pk 而不是 id,内部值 pk 将始终指向主键字段,即使它不称为“id”。
R
Ramy M. Mousa
Blog.objects.filter(author=author).values_list('pk', flat=True)

pk 改为 id,仅用于最佳做法。


S
Sahir Saiyed

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))