Kueri database Django: Bagaimana mendapatkan objek dengan id?

105

Django secara otomatis membuat field id sebagai kunci utama.

Sekarang saya perlu mendapatkan objek dengan id ini.

object = Class.objects.filter() 

Bagaimana cara menulis filter ini?

pengguna469652
sumber

Jawaban:

179

Jika Anda ingin mendapatkan sebuah objek, menggunakan get()lebih mudah:

obj = Class.objects.get(pk=this_object_id)
warnawarni
sumber
18
FYI, pkadalah cara yang disukai untuk merujuk ke kunci utama untuk model apa pun. The idlapangan hanya dihasilkan jika penulis Model tidak secara khusus menunjuk kunci utama. Jika penulis melakukan menentukan bidang kunci utama yang tidak bernama id, maka tidak akan menjadi idlapangan.
Craig Trader
Juga FYI, iddalam fungsi built-in yang mengembalikan identitas suatu objek. Dalam kebanyakan kasus, merujuk sesuatu dengan idakan melakukan hal yang benar, misalnya Class.objects.get(id=this_object_id)bekerja. Tapi kurasa itu sesuatu yang perlu dipertimbangkan.
Tom
15

Saya sampai di sini karena masalah yang sama, tetapi untuk alasan yang berbeda:

Class.objects.get(id=1)

Kode ini memunculkan pengecualian ImportError. Yang membingungkan saya adalah bahwa kode di bawah ini dieksekusi dengan baik dan mengembalikan hasil yang ditetapkan seperti yang diharapkan:

Class.objects.all()

Ekor pelacakan balik untuk get()metode ini:

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

Membaca kode di dalam Django loading.py, saya sampai pada kesimpulan bahwa saya settings.pymemiliki jalur yang buruk ke aplikasi saya yang berisi Classdefinisi model saya . Yang harus saya lakukan hanyalah memperbaiki jalur ke aplikasi danget() metode dijalankan dengan baik.

Ini saya settings.pydengan jalur yang dikoreksi:

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

)

Semua kebingungan disebabkan karena saya menggunakan ORM Django sebagai standalone, jadi namespace harus mencerminkan itu.

Lucio Paiva
sumber
2

Anda juga bisa melakukan:

obj = ClassModel.get_by_id(object_id)

Ini bekerja, tetapi mungkin saya tidak yakin apakah itu didukung di Django 2.

Anthony
sumber
2

Kamu bisa memakai:

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

Ini akan mengembalikan satu set kueri meskipun mendapat satu objek. Jika Anda membutuhkan tepat satu objek, gunakan:

obj=Class.objects.get(conditon="")
Pratik Randad
sumber
1

Anda juga dapat menggunakan pintasan get_object_or_404 django. Ini menimbulkan kesalahan 404 jika objek tidak ditemukan.

Loaderon
sumber