ChatGPT解决这个技术问题 Extra ChatGPT

django models: get list of id

How do i get a list of all id/primary key for a table. Say i have this table:

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

assume the field author is an Author object. I want to get all the ids of Blog where author=author

i know i can use

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

and get all the blog objects in a list form, but how do i get the list IDS/PK? Similar to "Select id from Blog where Author=author"

I am curious why you want this? Usually you don't deal with the primary key as its managed by django.
@burhan its kinda complicated, i need to use the list of PK/ID for another query, w/c is something like not_authored_blog = Author.objects.exclude(blog__id__in=blogs). i have another table which has FK to 'blog' and want to get the objects in the other table that is not FK in 'blog'. more complicated than that though
You can get around this by checking if the blog_set related manager has any records; if its empty, then this Author has no blogs. It will be a lot better than doing your exclude query, which might be translated as a large NOT IN clause.

p
phoenix

You can do this using values_list method.

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

See more at the Django queryset documentation.


Is there any way to get those ids without parse the returning queryset? I get and I want that list of ids. Is any pythonic way to avoid iterate over the rows?
list method get ids without parse the returning queryset. print(list(ids))
A
Andrew Gorcester
Blog.objects.filter(author=author).values_list('id', flat=True)

values_list() gives a list of rows, each row a tuple of all of the fields you specify as arguments, in order. If you only pass a single field in as an argument, you can also specify flat=True to get a plain list instead of a list of tuples.


It is best to use pk instead of id, the internal value pk will always point to the primary key field, even if its not called "id".
R
Ramy M. Mousa
Blog.objects.filter(author=author).values_list('pk', flat=True)

Put pk instead id, just for best practices.


S
Sahir Saiyed

values_list it returns tuples when iterated over. Each tuple contains the value from the respective field or expression passed into the 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))