Запрос к базе данных Django: как получить объект по идентификатору?


106

Django автоматически создает поле id в качестве первичного ключа.

Теперь мне нужно получить объект по этому идентификатору.

object = Class.objects.filter() 

Как написать этот фильтр?

Ответы:


184

Если вы хотите получить объект, get()проще использовать:

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

18
FYI, pkэто предпочтительный способ ссылаться на первичный ключ для любой модели. idПоле генерируется только если модель автор конкретно не назначает первичный ключ. Если автор сделал указать поле первичного ключа, не по имени id, то не будет idполе.
Craig Trader

Также к вашему сведению, idво встроенной функции, которая возвращает идентификатор объекта. В большинстве случаев ссылки на вещи idбудут делать правильные вещи, например, Class.objects.get(id=this_object_id)работать. Но я думаю, это то, что нужно учитывать.
Tom

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

Вы также можете:

obj = ClassModel.get_by_id(object_id)

Это работает, но я не уверен, поддерживается ли это в Django 2.


2

Ты можешь использовать:

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

Это вернет набор запросов, даже если он получит один объект. Если вам нужен ровно один объект, используйте:

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


0

Если у вас нет идентификатора, например mysite.com/something/9182301, вы можете использовать get_object_or_404импортfrom django.shortcuts import get_object_or_404 .

Пример использования:

def myFunc(request, my_pk):
    my_var = get_object_or_404(CLASS_NAME, pk=my_pk)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.