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


105

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

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

object = Class.objects.filter() 

如何编写此过滤器?

Answers:


179

如果要获取对象,则使用起来get()更简单:

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

18
仅供参考,pk是引用任何模型的主键的首选方式。id仅当模型作者未专门指定主键时,才生成该字段。如果作者确实指定了一个未命名的主键字段id,那么将没有id字段。
Craig Trader 2010年

也是FYI,id在返回对象标识的内置函数中。在大多数情况下,引用事物id将做正确的事情,例如Class.objects.get(id=this_object_id)工作。但这是我想考虑的问题。
汤姆(Tom)

15

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

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

您也可以这样做:

obj = ClassModel.get_by_id(object_id)

这行得通,但是我不确定Django 2是否支持它。


2

您可以使用:

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.