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

168

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

现在我需要通过这个id获取对象。

object = Class.objects.filter() 

如何编写该过滤器?

6个回答

293
如果你想获取一个对象,使用get()会更加直观:
obj = Class.objects.get(pk=this_object_id)

32
FYI,“pk”是指任何模型的首选主键的方式。如果模型作者没有明确指定主键,则会生成“id”字段。如果作者指定的主键字段不是“id”,则将不会有“id”字段。 - Craig Trader
另外顺便提一下,id是一个内置函数,用于返回对象的标识。在大多数情况下,通过id引用对象会起到正确的作用,例如Class.objects.get(id=this_object_id)。但这也是需要考虑的事情吧。 - Tom

26

我因同样的问题到达这里,但原因不同:

Class.objects.get(id=1)

这段代码引发了一个ImportError异常。让我感到困惑的是,下面的代码执行得很好,并按预期返回了结果集:

Class.objects.all()
< p > get()方法的回溯(traceback)尾部:

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,因此名称空间必须反映这一点。


10

你还可以使用 Django 中的 get_object_or_404 快捷方式。如果未找到对象,则它会引发 404 错误。


优雅的方法,除非不想显式处理对象未找到错误。 - Saurabh Mahra

4

您可以使用:

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

即使只有一个对象,此命令将返回查询集。如果你需要确切的一个对象,请使用以下方法:
obj=Class.objects.get(conditon="")

3

您还可以执行以下操作:

obj = ClassModel.get_by_id(object_id)


这个可以用,但我不确定它是否支持Django 2。

0

如果您没有某个ID,例如mysite.com/something/9182301,您可以使用from django.shortcuts import get_object_or_404导入get_object_or_404

使用示例:

def myFunc(request, my_pk):
    my_var = get_object_or_404(CLASS_NAME, pk=my_pk)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接