【发布时间】:2011-05-17 01:37:49
【问题描述】:
Django 自动创建一个 id 字段作为主键。
现在我需要通过这个 id 来获取对象。
object = Class.objects.filter()
这个过滤器怎么写?
【问题讨论】:
标签: django django-models django-orm
Django 自动创建一个 id 字段作为主键。
现在我需要通过这个 id 来获取对象。
object = Class.objects.filter()
这个过滤器怎么写?
【问题讨论】:
标签: django django-models django-orm
如果要获取对象,使用get() 更直接:
obj = Class.objects.get(pk=this_object_id)
【讨论】:
pk 是引用任何模型的主键的首选方式。 id 字段仅在模型作者未明确指定主键时生成。如果作者确实指定了一个未命名为id 的主键字段,则不会有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',
)
所有的混乱都是因为我使用 Django 的 ORM 作为独立的,所以命名空间必须反映这一点。
【讨论】:
您也可以使用get_object_or_404 django 快捷方式。如果找不到对象,则会引发 404 错误。
【讨论】:
你也可以这样做:
obj = ClassModel.get_by_id(object_id)
这可行,但我可能不确定 Django 2 是否支持它。
【讨论】:
你可以使用:
objects_all=Class.objects.filter(filter_condition="")
这将返回一个查询集,即使它得到一个对象。 如果您只需要一个对象,请使用:
obj=Class.objects.get(conditon="")
【讨论】:
如果您没有某些 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)
【讨论】: