Làm cách nào để chuyển đổi Django QuerySet thành một danh sách các phái? Tôi chưa tìm thấy câu trả lời cho điều này vì vậy tôi tự hỏi liệu tôi có thiếu một số loại chức năng trợ giúp phổ biến mà mọi người sử dụng hay không.
Làm cách nào để chuyển đổi Django QuerySet thành một danh sách các phái? Tôi chưa tìm thấy câu trả lời cho điều này vì vậy tôi tự hỏi liệu tôi có thiếu một số loại chức năng trợ giúp phổ biến mà mọi người sử dụng hay không.
Câu trả lời:
Sử dụng .values()
phương pháp:
>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]
Lưu ý: kết quả là một kết quả QuerySet
chủ yếu hoạt động giống như một danh sách, nhưng thực sự không phải là một ví dụ của list
. Sử dụng list(Blog.objects.values(…))
nếu bạn thực sự cần một phiên bản của list
.
values()
, tôi không biết liệu có phương pháp nào tốt để làm tương tự như cách values()
gọi các phương thức thể hiện không ?!
Các .values()
phương pháp sẽ trở lại bạn một kết quả của loại ValuesQuerySet
mà thường là những gì bạn cần trong hầu hết các trường hợp.
Nhưng nếu muốn, bạn có thể chuyển ValuesQuerySet
thành một danh sách Python gốc bằng cách sử dụng khả năng hiểu danh sách Python như được minh họa trong ví dụ bên dưới.
result = Blog.objects.values() # return ValuesQuerySet object
list_result = [entry for entry in result] # converts ValuesQuerySet into Python list
return list_result
Tôi thấy phần trên hữu ích nếu bạn đang viết các bài kiểm tra đơn vị và cần khẳng định rằng giá trị trả về mong đợi của một hàm khớp với giá trị trả về thực tế, trong trường hợp đó cả hai expected_result
và actual_result
phải cùng loại (ví dụ: từ điển).
actual_result = some_function()
expected_result = {
# dictionary content here ...
}
assert expected_result == actual_result
list(result)
Nếu bạn cần các kiểu dữ liệu gốc vì lý do nào đó (ví dụ: tuần tự hóa JSON) thì đây là cách nhanh chóng 'n' của tôi để làm điều đó:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
Như bạn có thể thấy việc xây dựng dict bên trong danh sách không thực sự KHÔ, vì vậy nếu ai đó biết cách tốt hơn ...
data = list( blogs )
và sau đó json.dumps( data )
. Một mảng xuất hiện với một loạt các đối tượng ở phía javascript, không cần phân tích cú pháp.
Bạn không xác định chính xác từ điển trông như thế nào, nhưng rất có thể bạn đang đề cập đến QuerySet.values()
. Từ tài liệu django chính thức :
Trả về a
ValuesQuerySet
- mộtQuerySet
lớp con trả về từ điển khi được sử dụng như một đối tượng có thể lặp lại, thay vì đối tượng mô hình.Mỗi từ điển đó đại diện cho một đối tượng, với các khóa tương ứng với tên thuộc tính của các đối tượng mô hình.
Nhập Truyền vào danh sách
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
Bạn có thể sử dụng values()
phương pháp trên dict bạn nhận được từ trường mô hình Django mà bạn thực hiện các truy vấn và sau đó bạn có thể dễ dàng truy cập từng trường bằng một giá trị chỉ mục.
Gọi nó như thế này -
myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...
Bạn cần DjangoJSONEncoder
và list
để làm cho bạn Queryset
đến json
, ref: Python JSON serialize một đối tượng Decimal
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
Nói một cách đơn giản list(yourQuerySet)
.
values()
trả về bằng cách chuyển chúng vào dưới dạng đối số. Ngoài ra, hãy cẩn thận mặc dù có vẻ như các giá trị trả về một danh sách các phái thực sự là một<class 'django.db.models.query.ValuesQuerySet'>
chứ không phải một danh sách.