Django автоматично створює поле id в якості основного ключа.
Тепер мені потрібно отримати об’єкт за цим ідентифікатором.
object = Class.objects.filter()
Як написати цей фільтр?
Django автоматично створює поле id в якості основного ключа.
Тепер мені потрібно отримати об’єкт за цим ідентифікатором.
object = Class.objects.filter()
Як написати цей фільтр?
Відповіді:
Якщо ви хочете отримати об’єкт, використання get()
є більш простим:
obj = Class.objects.get(pk=this_object_id)
id
у вбудованій функції, яка повертає ідентичність об'єкта. У більшості випадків посилання на речі id
роблять правильно, наприклад, Class.objects.get(id=this_object_id)
працюють. Але це я повинен врахувати.
Я потрапив сюди з тієї ж проблеми, але з іншої причини:
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 як окремий, тому простір імен повинен був це відображати.
Ви можете використовувати:
objects_all=Class.objects.filter(filter_condition="")
Це поверне набір запитів, навіть якщо він отримає один об'єкт. Якщо вам потрібен саме один об'єкт, використовуйте:
obj=Class.objects.get(conditon="")
Ви також можете скористатися ярликом django get_object_or_404 . Він викликає помилку 404, якщо об'єкт не знайдений.
pk
- це кращий спосіб посилання на первинний ключ для будь-якої моделі.id
Поле генерується тільки якщо модель автор конкретно не призначає первинний ключ. Якщо автор зробив вказати поле первинного ключа, що не по іменіid
, то не будеid
поле.