ฉันจะแปลง Django QuerySet เป็นรายการคำสั่งได้อย่างไร ฉันไม่พบคำตอบสำหรับเรื่องนี้ดังนั้นฉันจึงสงสัยว่าฉันไม่มีฟังก์ชันตัวช่วยทั่วไปที่ทุกคนใช้หรือไม่
ฉันจะแปลง Django QuerySet เป็นรายการคำสั่งได้อย่างไร ฉันไม่พบคำตอบสำหรับเรื่องนี้ดังนั้นฉันจึงสงสัยว่าฉันไม่มีฟังก์ชันตัวช่วยทั่วไปที่ทุกคนใช้หรือไม่
คำตอบ:
ใช้.values()วิธีการ:
>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]
หมายเหตุ: ผลลัพธ์คือสิ่งQuerySetที่ส่วนใหญ่ทำงานเหมือนรายการ แต่ไม่ได้เป็นตัวอย่างของlist. ใช้list(Blog.objects.values(…))หากคุณต้องการอินสแตนซ์ของlistไฟล์.
values()ฉันไม่รู้ว่ามีวิธีการที่ดีในการทำเช่นเดียวvalues()กับการเรียกวิธีการอินสแตนซ์ด้วยหรือไม่!
.values()วิธีการจะกลับคุณเป็นผลมาจากประเภทValuesQuerySetซึ่งโดยปกติคือสิ่งที่คุณต้องการในกรณีส่วนใหญ่
แต่ถ้าคุณต้องการคุณสามารถเปลี่ยนValuesQuerySetเป็นรายการ Python ดั้งเดิมได้โดยใช้ความเข้าใจรายการ Python ดังที่แสดงในตัวอย่างด้านล่าง
result = Blog.objects.values() # return ValuesQuerySet object
list_result = [entry for entry in result] # converts ValuesQuerySet into Python list
return list_result
ฉันพบว่าข้างต้นช่วยได้หากคุณกำลังเขียนการทดสอบหน่วยและจำเป็นต้องยืนยันว่าค่าผลตอบแทนที่คาดหวังของฟังก์ชันตรงกับค่าที่ส่งคืนจริงซึ่งในกรณีนี้ทั้งสองอย่างexpected_resultและactual_resultต้องเป็นประเภทเดียวกัน (เช่นพจนานุกรม)
actual_result = some_function()
expected_result = {
# dictionary content here ...
}
assert expected_result == actual_result
list(result)
หากคุณต้องการประเภทข้อมูลเนทีฟด้วยเหตุผลบางประการ (เช่นการทำให้อนุกรม JSON) นี่เป็นวิธีสกปรกอย่างรวดเร็วของฉัน:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
อย่างที่คุณเห็นการสร้างคำสั่งภายในรายการนั้นไม่ได้แห้งจริงๆดังนั้นหากมีใครรู้วิธีที่ดีกว่านี้ ...
data = list( blogs ) json.dumps( data )อาร์เรย์ออกมาพร้อมกับวัตถุมากมายที่ด้านจาวาสคริปต์โดยไม่จำเป็นต้องแยกวิเคราะห์
คุณไม่ตรงกำหนดสิ่งที่พจนานุกรมควรมีลักษณะเช่น QuerySet.values()แต่ส่วนใหญ่มีแนวโน้มที่คุณจะหมายถึง จากเอกสาร django อย่างเป็นทางการ :
ส่งคืน a
ValuesQuerySet-QuerySetคลาสย่อยที่ส่งคืนพจนานุกรมเมื่อใช้เป็นอ็อบเจ็กต์ที่ทำซ้ำได้แทนที่จะเป็นโมเดลอินสแตนซ์พจนานุกรมเหล่านั้นแต่ละคำแสดงถึงออบเจ็กต์โดยมีคีย์ที่ตรงกับชื่อแอ็ตทริบิวต์ของโมเดลอ็อบเจ็กต์
พิมพ์ Cast to List
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
คุณสามารถใช้values()วิธีการตามคำสั่งที่คุณได้รับจากฟิลด์โมเดล Django ที่คุณสร้างแบบสอบถามจากนั้นคุณสามารถเข้าถึงแต่ละฟิลด์ได้อย่างง่ายดายด้วยค่าดัชนี
เรียกแบบนี้ -
myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...
คุณต้องการDjangoJSONEncoderและlistจะทำให้คุณQuerysetไปjsonอ้างอิง: งูหลาม JSON อันดับวัตถุทศนิยม
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
คุณสามารถกำหนดฟังก์ชันโดยใช้ model_to_dict ได้ดังนี้:
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
values()ส่งคืนโดยส่งเป็นอาร์กิวเมนต์ ระวังด้วยแม้ว่าดูเหมือนว่าค่าจะส่งคืนรายการของคำสั่งซึ่งเป็นรายการ<class 'django.db.models.query.ValuesQuerySet'>และไม่ใช่รายการ