oracle 获取ORA-00918:在从2.0升级到django 3.03后,试图打开django管理页面的一列模糊定义的错误

zaq34kh6  于 2023-10-16  发布在  Oracle
关注(0)|答案(3)|浏览(109)

获取django.db.utils.DatabaseError:ORA-00918:当我尝试打开Django管理页面时,出现列定义模糊的错误。下面是错误:
raise dj_exc_value.with_traceback(traceback)from exc_value File“/venomscribe/lib/python3.6/site-packages/django/db/backends/utils.py“,line 86,in _execute return self.cursor.execute(sql,params)File“/venomscribe/lib/python3.6/site-packages/django/db/backends/oracle/base.py“,line 514,in execute return self.cursor.execute(query,self._param_generator(params))django.db.utils.DatabaseError:ORA-00918:列定义不明确
查询

SELECT "DJANGO_ADMIN_LOG"."ID",
       "DJANGO_ADMIN_LOG"."ACTION_TIME",
       "DJANGO_ADMIN_LOG"."USER_ID",
       "DJANGO_ADMIN_LOG"."CONTENT_TYPE_ID",
       "DJANGO_ADMIN_LOG"."OBJECT_ID",
       "DJANGO_ADMIN_LOG"."OBJECT_REPR",
       "DJANGO_ADMIN_LOG"."ACTION_FLAG",
       "DJANGO_ADMIN_LOG"."CHANGE_MESSAGE",
       "AUTH_USER"."ID",
       "AUTH_USER"."PASSWORD",
       "AUTH_USER"."LAST_LOGIN",
       "AUTH_USER"."IS_SUPERUSER",
       "AUTH_USER"."USERNAME",
       "AUTH_USER"."FIRST_NAME",
       "AUTH_USER"."LAST_NAME",
       "AUTH_USER"."EMAIL",
       "AUTH_USER"."IS_STAFF",
       "AUTH_USER"."IS_ACTIVE",
       "AUTH_USER"."DATE_JOINED",
       "DJANGO_CONTENT_TYPE"."ID",
       "DJANGO_CONTENT_TYPE"."APP_LABEL",
       "DJANGO_CONTENT_TYPE"."MODEL"
  FROM "DJANGO_ADMIN_LOG"
  INNER JOIN "AUTH_USER"
    ON ("DJANGO_ADMIN_LOG"."USER_ID" = "AUTH_USER"."ID")
  LEFT OUTER JOIN "DJANGO_CONTENT_TYPE"
    ON ("DJANGO_ADMIN_LOG"."CONTENT_TYPE_ID" = "DJANGO_CONTENT_TYPE"."ID")
  WHERE "DJANGO_ADMIN_LOG"."USER_ID" = :arg0
  ORDER BY "DJANGO_ADMIN_LOG"."ACTION_TIME" DESC
  FETCH FIRST 10 ROWS ONLY
kq4fsx7k

kq4fsx7k1#

这是系统需求问题。我使用的是Oracle 12.1,它与Django 3.0.3不兼容。降级到2.2解决了这个问题。

vnzz0bqm

vnzz0bqm2#

您正在获取DJANGO_ADMIN_TYPE.ID、AUTH_USER.ID和DJANGO_CONTENT_TYPE.ID,因此您试图在结果集中有三个ID列。这是不允许的。我建议您为这些列设置别名,以便区分它们:

SELECT l.ID AS DJANGO_ADMIN_LOG_ID,
       l.ACTION_TIME,
       l.USER_ID,
       l.CONTENT_TYPE_ID,
       l.OBJECT_ID,
       l.OBJECT_REPR,
       l.ACTION_FLAG,
       l.CHANGE_MESSAGE,
       u.ID AS AUTH_USER_ID,
       u.PASSWORD,
       u.LAST_LOGIN,
       u.IS_SUPERUSER,
       u.USERNAME,
       u.FIRST_NAME,
       u.LAST_NAME,
       u.EMAIL,
       u.IS_STAFF,
       u.IS_ACTIVE,
       u.DATE_JOINED,
       t.ID AS DJANGO_CONTENT_TYPE_ID,
       t.APP_LABEL,
       t.MODEL
  FROM DJANGO_ADMIN_LOG l
  INNER JOIN AUTH_USER u
    ON l.USER_ID = u.ID
  LEFT OUTER JOIN DJANGO_CONTENT_TYPE t
    ON l.CONTENT_TYPE_ID = t.ID
  WHERE l.USER_ID = :arg0
  ORDER BY l.ACTION_TIME DESC
  FETCH FIRST 10 ROWS ONLY

我还建议您使用白色空格和表别名,以使查询更易于阅读。

px9o7tmv

px9o7tmv3#

我在使用Oracle 12 c时遇到了这个错误。
如果其他人得到这个错误,我通过覆盖Django的模板并删除日志块来解决它。这个错误发生在Django的django/contrib/admin/templates/admin/index.html:26文件中。
这一行调用函数get_admin_log,在那里会引发这个错误。通过移除这个区块,你可以正常呈现Django Admin主页。
以下是Django关于覆盖模板的文档:https://docs.djangoproject.com/en/3.2/howto/overriding-templates/
基本上,需要在setting.py中指定模板文件夹,并在模板文件夹中创建admin/index.html文件,并将原始索引中的内容放置在其中,如下所示:

{% extends "admin/base_site.html" %}
{% load i18n static %}

{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/dashboard.css" %}">{% endblock %}

{% block coltype %}colMS{% endblock %}

{% block bodyclass %}{{ block.super }} dashboard{% endblock %}

{% block breadcrumbs %}{% endblock %}

{% block nav-sidebar %}{% endblock %}

{% block content %}
<div id="content-main">
  {% include "admin/app_list.html" with app_list=app_list show_changelinks=True %}
</div>
{% endblock %}

{% block sidebar %}
<!-- REMOVE THE CODE FROM HERE -->
<!-- django/contrib/admin/templates/admin/index.html -->
{% endblock %}

*注意:需要删除代码;如果你只是用HTML注解来注解它,Django/Jinja会继续调用这个函数。

另一个选择是重新创建get_admin_log函数来解决这个问题并保留历史记录。

相关问题