Django values_list เทียบกับค่า


146

ใน Django ความแตกต่างระหว่างสองสิ่งต่อไปนี้คืออะไร:

Article.objects.values_list('comment_id', flat=True).distinct()

VS

Article.objects.values('comment_id').distinct()

เป้าหมายของฉันคือการรับรายการรหัสความคิดเห็นที่ไม่ซ้ำกันในแต่ละArticleรายการ ฉันได้อ่านเอกสาร (และอันที่จริงได้ใช้วิธีการทั้งสอง) ผลลัพธ์ดูเหมือนจะเปิดเผยโดยเปิดเผย


ด้วย values_list คุณสามารถทำได้if self.id in Article.objects.values_list('comment_id', flat=True):ในขณะที่ใช้ค่าที่คุณต้องใช้ในการเข้าถึงพจนานุกรม
dnaranjo

1
@dnaranjo - คุณทำได้ แต่ทำไมไม่ทำอย่างนั้นArticle.objects.filter(comment_id=self.id).exists()?
Sayse

1
นั่นเป็นคำตอบสำหรับคำถามที่แตกต่าง
dnaranjo

คำตอบ:


250

values()วิธีการส่งกลับชุดข้อความที่มีพจนานุกรม:

<QuerySet [{'comment_id': 1}, {'comment_id': 2}]>

values_list()วิธีการส่งกลับชุดข้อความที่มีอันดับ:

<QuerySet [(1,), (2,)]>

หากคุณกำลังใช้values_list()กับเขตข้อมูลเดียวคุณสามารถใช้flat=Trueเพื่อส่งกลับ QuerySet ของค่าเดียวแทนที่จะเป็น 1-tuples:

<QuerySet [1, 2]>

โอ้และไม่มีความแตกต่างระหว่างสอง vis-a-vis วิธีการdistinct()ใช้ huh?
Hassan Baig

2
ไม่ฉันไม่คิดว่าจะdistinct()ทำงานต่างไป สิ่งสำคัญคือโครงสร้างข้อมูลที่คุณต้องการใช้งาน
อะลาสแดร์

3
values()ผลตอบแทนและไม่ได้เป็นQuerySet listแม้ว่าวัตถุที่ส่งกลับมาโดยvalues()มีลักษณะเหมือน a listแต่ก็ไม่ได้ทำตัวเหมือนวัตถุหนึ่งในบางกรณี ตัวอย่างเช่นมันจะไม่เป็น json ต่อเนื่องจนกว่าเราจะแปลงเป็น `รายการ '
Abhijit Ghate

@Abhijit ดูดีมากฉันได้อัปเดตคำตอบเพื่อให้ชัดเจนยิ่งขึ้น
Alasdair

2
คุณสามารถแปลงกลับมาจากการvalues_listไปยังรายการหลามจริงโดยเพียงแค่ใช้listฟังก์ชั่น:list(Article.objects.values_list('comment_id', flat=True).distinct())
inostia

55

ค่า ()

ส่งคืน QuerySet ที่ส่งกลับdictionariesแทนที่จะเป็นอินสแตนซ์ของโมเดลเมื่อใช้เป็น iterable

values_list ()

ส่งคืน QuerySet ที่ส่งกลับlist of tuplesแทนที่จะเป็นอินสแตนซ์ของโมเดลเมื่อใช้เป็น iterable

ที่แตกต่างกัน ()

ความแตกต่างถูกนำมาใช้กับeliminate the duplicateองค์ประกอบ

ตัวอย่าง:

Article.objects.values_list('id', flat=True) # flat=True will remove the tuples and return the list   
[1, 2, 3, 4, 5, 6]

Article.objects.values('id')
[{'id':1}, {'id':2}, {'id':3}, {'id':4}, {'id':5}, {'id':6}]

2
ดังนั้นรายการของพจนานุกรมที่ส่งคืนในกรณีของvalues
Hassan Baig

เพียงชี้แจง: distinct()กำจัดองค์ประกอบที่ซ้ำกันออกจากผลลัพธ์ของแบบสอบถามไม่ใช่จากฐานข้อมูล
oz19

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.