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

use*_*652 85 django django-models django-orm

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

现在我需要通过此id获取对象.

object = Class.objects.filter() 
Run Code Online (Sandbox Code Playgroud)

怎么写这个过滤器?

iri*_*ent 152

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

obj = Class.objects.get(pk=this_object_id)
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,`pk`是引用任何模型的主键的首选方式.只有在模型作者没有专门指定主键时才会生成`id`字段.如果作者*确实*指定了一个未命名为`id`的主键字段,则不会有`id`字段. (13认同)

Luc*_*iva 13

我来到这里是为了同样的问题,但原因不同:

Class.objects.get(id=1)
Run Code Online (Sandbox Code Playgroud)

此代码引发了ImportError异常.令我困惑的是,下面的代码执行正常,并按预期返回结果集:

Class.objects.all()
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

阅读Django中的代码loading.py,我得出结论,settings.py我的应用程序包含了我的Class模型定义.我所要做的就是纠正应用程序的路径,并且get()方法执行得很好.

这是我settings.py的纠正路径:

INSTALLED_APPS = (
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    # ...
    'mywebproject.myapp',
Run Code Online (Sandbox Code Playgroud)

)

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


Loa*_*ron 6

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