Làm cách nào để chuyển đổi Django QuerySet thành danh sách các phái?


122

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:


177

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ả QuerySetchủ 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.


7
có, bạn chỉ định trường nào bạn muốn 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.
dm03514

10
điều này không thực sự trả lại một danh sách
astreltsov

Ngoài ra, bạn không thể nhận được kết quả của các phương thức cá thể của đối tượng của bạn 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 ?!
Asara

34

Các .values()phương pháp sẽ trở lại bạn một kết quả của loại ValuesQuerySetmà 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 ValuesQuerySetthà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_resultactual_resultphải cùng loại (ví dụ: từ điển).

actual_result = some_function()
expected_result = {
    # dictionary content here ...
}
assert expected_result == actual_result

17
Hoặc bạn có thể đơn giản hóa việc chuyển đổi vào danh sách với điều nàylist(result)
Adiyat Mubarak

12

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


Tôi dường như đã làm cho nó hoạt động với 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.
Arthur Tarasov

3

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ột QuerySetlớ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.


2

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

1

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


0

Nói một cách đơn giản list(yourQuerySet).


2
Điều này cung cấp cho bạn một danh sách các đối tượng, không phải danh sách các phái.
Flimm,

0

Bạn có thể xác định một hàm bằng cách sử dụng model_to_dict như sau:

def queryset_to_dict(qs,fields=None, exclude=None):
    my_array=[]
    for x in qs:
        my_array.append(model_to_dict(x,fields=fields,exclude=exclude))
    return my_array
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.