Truy vấn cơ sở dữ liệu Django: Làm thế nào để lấy đối tượng theo id?


105

Django tự động tạo một trường id làm khóa chính.

Bây giờ tôi cần lấy đối tượng bằng id này.

object = Class.objects.filter() 

Làm thế nào để viết bộ lọc này?

Câu trả lời:


179

Nếu bạn muốn lấy một đối tượng, cách sử dụng get()đơn giản hơn:

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

18
FYI, pklà cách ưa thích để tham chiếu đến khóa chính cho bất kỳ mô hình nào. Trường idchỉ được tạo nếu tác giả mô hình không chỉ định cụ thể khóa chính. Nếu tác giả đã chỉ định một trường khóa chính không được đặt tên id, thì sẽ không có idtrường này.
Craig Trader

Ngoài ra FYI, idtrong một hàm tích hợp trả về danh tính của một đối tượng. Trong đa số các trường hợp, việc tham khảo mọi thứ idsẽ làm đúng như Class.objects.get(id=this_object_id)công việc. Nhưng đó là một cái gì đó để xem xét tôi đoán.
Tom,

15

Tôi đến đây vì cùng một vấn đề, nhưng vì một lý do khác:

Class.objects.get(id=1)

Mã này đã tăng một ngoại lệ ImportError. Điều khiến tôi bối rối là đoạn mã dưới đây thực thi tốt và trả về kết quả được đặt như mong đợi:

Class.objects.all()

Phần đuôi của get()phương pháp truy vết :

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

Đọc mã bên trong Django's loading.py, tôi đi đến kết luận rằng của tôi settings.pycó một đường dẫn xấu đến ứng dụng của tôi chứa Classđịnh nghĩa mô hình của tôi . Tất cả những gì tôi phải làm là sửa lại đường dẫn đến ứng dụng và get()phương thức được thực thi tốt.

Đây là của tôi settings.pyvới đường dẫn đã sửa:

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

)

Tất cả sự nhầm lẫn được gây ra bởi vì tôi đang sử dụng ORM của Django như một độc lập, vì vậy không gian tên phải phản ánh điều đó.


2

Bạn cũng có thể làm:

obj = ClassModel.get_by_id(object_id)

Điều này hoạt động, nhưng có thể tôi không chắc liệu nó có được hỗ trợ trong Django 2 hay không.


2

Bạn có thể dùng:

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

Điều này sẽ trả về một tập hợp truy vấn ngay cả khi nó nhận được một đối tượng. Nếu bạn cần sử dụng chính xác một đối tượng:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.