Запит бази даних 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.