Запит бази даних Django: Як отримати об’єкт за ідентифікатором?


105

Django автоматично створює поле id в якості основного ключа.

Тепер мені потрібно отримати об’єкт за цим ідентифікатором.

object = Class.objects.filter() 

Як написати цей фільтр?

Відповіді:


179

Якщо ви хочете отримати об’єкт, використання get()є більш простим:

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

18
FYI pk- це кращий спосіб посилання на первинний ключ для будь-якої моделі. idПоле генерується тільки якщо модель автор конкретно не призначає первинний ключ. Якщо автор зробив вказати поле первинного ключа, що не по імені id, то не буде idполе.
Крейг Трейдер

Також 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

Ви також можете зробити:

obj = ClassModel.get_by_id(object_id)

Це працює, але, можливо, я не впевнений, чи підтримується це в Django 2.


2

Ви можете використовувати:

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

Це поверне набір запитів, навіть якщо він отримає один об'єкт. Якщо вам потрібен саме один об'єкт, використовуйте:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.