моделі django: отримати список ідентифікаторів


78

Як отримати список усіх ідентифікаторів / первинного ключа для таблиці. Скажімо, у мене є ця таблиця:

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

припустимо, що автор поля - це об’єкт автора. Я хочу отримати всі ідентифікатори блогу, де автор = автор

я знаю, що можу використовувати

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

і отримати всі об’єкти блогу у формі списку, але як мені отримати список IDS / PK списку? Подібно до "Виберіть ідентифікатор із блогу, де Автор = автор"


Мені цікаво, чому ти цього хочеш? Зазвичай ви не маєте справу з первинним ключем, оскільки ним керує django.
Бурхан Халід

@burhan це якось складно, мені потрібно використовувати список PK / ID для іншого запиту, w / c щось на зразок not_authored_blog = Author.objects.exclude(blog__id__in=blogs). у мене є інша таблиця, в якій є FK для "блогу", і я хочу отримати об'єкти в іншій таблиці, яка не є FK у "blog". все-таки складніше, ніж це
ibaguio 02.03.14

Ви можете обійти це, перевіривши, чи blog_setпов’язаний менеджер має записи; якщо він порожній, то цей автор не має блогів. Це буде набагато краще, ніж виконати ваш запит на виключення, який може бути перекладений як великий NOT INпункт.
Бурхан Халід

Відповіді:


136

Ви можете зробити це values_listметодом.

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

Докладніше див . У документації набору запитів Django .


1
Чи є спосіб отримати ці ідентифікатори без аналізу повертається набору запитів? Я отримую <QuerySet [13, 14, 15]> і хочу цей список ідентифікаторів. Чи є який-небудь пітонічний спосіб уникнути перебору рядків?
RuBiCK

метод list отримує ідентифікатори без аналізу повертається набору запитів. друк (список (ідентифікатори))
Сахір Саїєд

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

values_list()дає список рядків, у кожному рядку - кортеж усіх полів, які ви вказуєте як аргументи, по порядку. Якщо ви передаєте лише одне поле як аргумент, ви також можете вказати, flat=Trueщоб отримати звичайний список замість списку кортежів.


23
Найкраще використовувати pkзамість id, внутрішнє значення pkзавжди буде вказувати на поле первинного ключа, навіть якщо воно не називається "id".
Бурхан Халід


1

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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.