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

106

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

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

object = Class.objects.filter() 

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

user469652
источник

Ответы:

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="")
Pratik Randad
источник
1

Вы также можете использовать ярлык get_object_or_404 django. Если объект не найден, возникает ошибка 404.

Лоадерон
источник
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)
Эберт Родригес
источник