Django数据库查询:如何通过id获取对象?

时间:2010-11-29 02:14:39

标签: django django-models django-orm

Django自动创建一个id字段作为主键。

现在我需要通过此ID获取对象。

object = Class.objects.filter() 

如何编写此过滤器?

6 个答案:

答案 0 :(得分:131)

如果你想获得一个对象,使用get()会更直接:

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

答案 1 :(得分:12)

我来到这里遇到同样的问题,但出于不同的原因:

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',

所有混淆都是因为我使用Django的ORM作为独立的,因此命名空间必须反映出来。

答案 2 :(得分:1)

您还可以使用get_object_or_404 django快捷方式。如果找不到对象,则会引发404错误。

答案 3 :(得分:0)

您也可以这样做:

obj = ClassModel.get_by_id(object_id)

这可行,但是我不确定Django 2是否支持。

答案 4 :(得分:0)

您可以使用:

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

这将返回一个查询集,即使它得到一个对象。 如果您只需要一个对象,请使用:

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

答案 5 :(得分:0)

如果没有id,例如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)