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="")
Вы также можете использовать ярлык get_object_or_404 django. Если объект не найден, возникает ошибка 404.
Если у вас нет идентификатора, например 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)
pk
это предпочтительный способ ссылаться на первичный ключ для любой модели.id
Поле генерируется только если модель автор конкретно не назначает первичный ключ. Если автор сделал указать поле первичного ключа, не по имениid
, то не будетid
поле.