django models: lấy danh sách id


78

Làm cách nào để lấy danh sách tất cả id / khóa chính cho một bảng. Giả sử tôi có bảng này:

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

giả sử trường tác giả là một đối tượng Author. Tôi muốn lấy tất cả id của Blog nơi author = tác giả

tôi biết tôi có thể sử dụng

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

và lấy tất cả các đối tượng blog dưới dạng danh sách, nhưng làm cách nào để lấy IDS / PK danh sách? Tương tự với "Chọn id từ Blog nơi Tác giả = tác giả"


Tôi tò mò tại sao bạn muốn điều này? Thông thường, bạn không xử lý khóa chính vì nó được quản lý bởi django.
Burhan Khalid

@burhan hơi phức tạp, tôi cần sử dụng danh sách PK / ID cho một truy vấn khác, w / c giống như vậy not_authored_blog = Author.objects.exclude(blog__id__in=blogs). tôi có một bảng khác có FK để 'viết blog' và muốn lấy các đối tượng trong bảng khác không phải là FK trong 'blog'. phức tạp hơn thế mặc dù
ibaguio

Bạn có thể giải quyết vấn đề này bằng cách kiểm tra xem người blog_setquản lý liên quan có bất kỳ hồ sơ nào không; nếu nó trống, thì Tác giả này không có blog. Nó sẽ tốt hơn rất nhiều so với việc thực hiện truy vấn loại trừ của bạn, có thể được dịch là một NOT INmệnh đề lớn .
Burhan Khalid

Câu trả lời:


136

Bạn có thể làm điều này bằng values_listphương pháp.

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

Xem thêm tại tài liệu bộ truy vấn Django .


1
Có cách nào để lấy các id đó mà không cần phân tích cú pháp bộ truy vấn trả về không? Tôi nhận được <QuerySet [13, 14, 15]> và tôi muốn danh sách id đó. Có cách nào để tránh lặp lại các hàng không?
RuBiCK

phương pháp danh sách nhận id mà không cần phân tích cú pháp bộ truy vấn trả về. print (danh sách (id))
Sahir Saiyed

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

values_list()cung cấp danh sách các hàng, mỗi hàng là một bộ của tất cả các trường bạn chỉ định làm đối số, theo thứ tự. Nếu bạn chỉ chuyển một trường duy nhất vào làm đối số, bạn cũng có thể chỉ định flat=Trueđể có được một danh sách đơn giản thay vì danh sách các bộ giá trị.


23
Tốt nhất là sử dụng pkthay vì id, giá trị nội bộ pksẽ luôn trỏ đến trường khóa chính, ngay cả khi nó không được gọi là "id".
Burhan Khalid

5
Blog.objects.filter(author=author).values_list('pk', flat=True)

Đặt pkthay id, chỉ dành riêng cho thực hành tốt nhất.


1

values_listnó trả về các bộ giá trị khi được lặp lại. Mỗi bộ giá trị chứa giá trị từ trường hoặc biểu thức tương ứng được chuyển vào các giá trị_sách_kết ().

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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.