แบบสอบถามฐานข้อมูล Django: วิธีรับวัตถุโดย id?


105

Django จะสร้างฟิลด์ id เป็นคีย์หลักโดยอัตโนมัติ

ตอนนี้ฉันต้องการรับวัตถุด้วยรหัสนี้

object = Class.objects.filter() 

จะเขียนฟิลเตอร์นี้อย่างไร?

คำตอบ:


180

หากคุณต้องการรับวัตถุการใช้งานget()นั้นตรงไปตรงมามากกว่า:

obj = Class.objects.get(pk=this_object_id)

18
FYI pkเป็นวิธีที่แนะนำในการอ้างถึงคีย์หลักสำหรับรุ่นใด ๆ idข้อมูลจะถูกสร้างขึ้นเฉพาะในกรณีที่ผู้เขียนรูปแบบไม่เฉพาะกำหนดคีย์หลัก หากผู้เขียนไม่ระบุเขตข้อมูลคีย์หลักที่ยังไม่ได้ตั้งชื่อidแล้วจะไม่เป็นidฟิลด์
Craig Trader

นอกจากนี้ FYI idในฟังก์ชันในตัวที่ส่งคืนข้อมูลประจำตัวของวัตถุ ในกรณีส่วนใหญ่การอ้างถึงสิ่งต่างๆโดยidจะทำในสิ่งที่ถูกต้องเช่นClass.objects.get(id=this_object_id)ทำงาน แต่นั่นเป็นสิ่งที่ต้องพิจารณาฉันเดา
ทอม

15

ฉันมาที่นี่ด้วยปัญหาเดียวกัน แต่ด้วยเหตุผลอื่น:

Class.objects.get(id=1)

รหัสนี้เพิ่มข้อยกเว้น ImportError สิ่งที่ทำให้ฉันสับสนคือโค้ดด้านล่างทำงานได้ดีและส่งคืนผลลัพธ์ตามที่คาดไว้:

Class.objects.all()

หางของการย้อนกลับสำหรับget()วิธีการ:

File "django/db/models/loading.py", line 197, in get_models
    self._populate()
File "django/db/models/loading.py", line 72, in _populate
    self.load_app(app_name, True)
File "django/db/models/loading.py", line 94, in load_app
    app_module = import_module(app_name)
File "django/utils/importlib.py", line 35, in import_module
    __import__(name)
ImportError: No module named myapp

เมื่ออ่านโค้ดภายใน Django loading.pyฉันได้ข้อสรุปว่าฉันsettings.pyมีเส้นทางที่ไม่ดีไปยังแอปของฉันซึ่งมีClassคำจำกัดความของโมเดลของฉัน สิ่งที่ฉันต้องทำคือแก้ไขเส้นทางไปยังแอพและget()วิธีการดำเนินการได้ดี

นี่คือsettings.pyเส้นทางที่ถูกต้องของฉัน:

INSTALLED_APPS = (
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    # ...
    'mywebproject.myapp',

)

ความสับสนทั้งหมดเกิดจากฉันใช้ ORM ของ Django เป็นแบบสแตนด์อโลนดังนั้นเนมสเปซจึงต้องสะท้อนสิ่งนั้น



2

คุณสามารถใช้ได้:

objects_all=Class.objects.filter(filter_condition="")

สิ่งนี้จะส่งคืนชุดแบบสอบถามแม้ว่าจะได้รับวัตถุหนึ่งชิ้น หากคุณต้องการใช้วัตถุชิ้นเดียว:

obj=Class.objects.get(conditon="")

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