【问题标题】:Django database query: How to get object by id?Django 数据库查询:如何通过 id 获取对象?
【发布时间】:2011-05-17 01:37:49
【问题描述】:

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

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

object = Class.objects.filter() 

这个过滤器怎么写?

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    如果要获取对象,使用get() 更直接:

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

    【讨论】:

    • 仅供参考,pk 是引用任何模型的主键的首选方式。 id 字段仅在模型作者未明确指定主键时生成。如果作者确实指定了一个未命名为id 的主键字段,则不会有id 字段。
    • 也仅供参考,id 在返回对象标识的内置函数中。在大多数情况下,通过id 引用事物会做正确的事情,例如Class.objects.get(id=this_object_id) 工作。但我猜这是要考虑的事情。
    【解决方案2】:

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

    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 作为独立的,所以命名空间必须反映这一点。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        你也可以这样做:

        obj = ClassModel.get_by_id(object_id)
        
        

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

        【讨论】:

          【解决方案5】:

          你可以使用:

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

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

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

          【讨论】:

            【解决方案6】:

            如果您没有某些 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)
            

            【讨论】:

              猜你喜欢
              • 2018-09-09
              • 2019-09-17
              • 2012-06-30
              • 2021-04-04
              • 2022-11-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多