choice_set ในกวดวิชาของแอป Django นี้คืออะไร?


144

มีบรรทัดนี้ในบทช่วยสอน Django การเขียนแอป Django แรกของคุณตอนที่ 1 :

p.choice_set.create(choice='Not much', votes=0)

ถูกchoice_setเรียกเข้าสู่การดำรงอยู่ได้อย่างไรและมันคืออะไร?

ฉันคิดว่าchoiceส่วนนั้นเป็นรุ่นที่เล็กกว่าของรุ่นที่Choiceใช้ในการสอน แต่มันคือchoice_setอะไร? คุณสามารถทำอย่างละเอียด?

UPDATE:ขึ้นอยู่กับเบนคำตอบของผมอยู่เอกสารฉบับนี้: ความสัมพันธ์ต่อไป 'ย้อนหลัง'


ฉันควรจะเชื่อมโยงกับเอกสารนั้นมันชัดเจนกว่าคำตอบของฉัน
Ben James

@Ben James: ไม่ฉันขอขอบคุณที่ได้กำหนดไว้ในวิธีที่แตกต่างกันโดยเฉพาะอย่างยิ่งรายละเอียดของสิ่งที่ ORM กำลังทำอยู่ เอกสาร Django สามารถกระชับได้ตลอดเวลา
Peter Mortensen

40
ขอบคุณที่ถามคำถามนี้ฉันสับสนเพราะมันไม่ได้อธิบายในบทช่วยสอน
claudio

4
ว้าวนั่นเป็นรหัสโหลดสำหรับมือใหม่ สำหรับฉันอุปสรรค์คือการเข้าใจว่าเราได้รับวัตถุทางเลือกที่เกี่ยวข้องกับคำถามเพื่อที่จะเพิ่มขึ้นมันเป็นทางเลือกโหวตโดยหนึ่ง แนวคิดเกี่ยวกับ RelatedManager ไม่ได้ถูกกล่าวถึงในบทช่วยสอนถึงจุดนี้เพื่อให้สามารถเป็นบล็อกที่ทำให้สะดุดได้
Frozenjim

@PeterMortensen คุณช่วยกรุณาอัปเดตเอกสารที่อธิบายได้หรือไม่? ขอบคุณ
MH

คำตอบ:


179

คุณสร้างคีย์ต่างประเทศที่เกี่ยวข้องหนึ่งไปยังแต่ละChoiceQuestion

ดังนั้นแต่ละฟิลด์จะChoiceมีquestionฟิลด์ซึ่งคุณประกาศไว้ในโมเดลอย่างชัดเจน

ออมของ Django ตามไปข้างหลังความสัมพันธ์จากQuestionเกินไปสร้างฟิลด์เช่นกันเรียกว่าโดยอัตโนมัติfoo_setซึ่งFooเป็นรูปแบบที่มีForeignKeyข้อมูลรูปแบบที่

choice_setเป็นสิ่งRelatedManagerที่สามารถสร้างชุดแบบสอบถามของChoiceวัตถุที่เกี่ยวข้องกับQuestionอินสแตนซ์เช่นq.choice_set.all()

ถ้าคุณทำไม่ได้เช่นfoo_setการตั้งชื่อซึ่ง Django เลือกโดยอัตโนมัติหรือถ้าคุณมีคีย์ต่างประเทศมากกว่าหนึ่งรูปแบบเดียวกันและความจำเป็นที่จะแยกแยะพวกเขาคุณสามารถเลือกชื่อที่เอาชนะคุณเองโดยใช้อาร์กิวเมนต์related_nameForeignKey


ขอบคุณ ตอนนี้ฉันรู้มากขึ้น choice_set ไม่ใช่ "ผู้จัดการ" หรือไม่ (ที่สามารถส่งคืนอินสแตนซ์ของคลาส QuerySet) หรือมันคือสิ่งเดียวกัน?
Peter Mortensen

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