Django-Raw查询必须包含主键

2024-06-26 10:07:59 发布

您现在位置:Python中文网/ 问答频道 /正文

这里有一个类似的问题-Raw query must include the primary key

但是,我正在使用一个遗留数据库,因此无法找出主键的问题所在。

这是我的原始查询-

trg = Trgjob.objects.db_manager('AdmiralDEV').raw("""
    SELECT jobdep_id, jm.jobmst_id, jobdep_type, (jm1.jobmst_prntname + '\' + jm1.jobmst_name) AS jobdep_jobmst,
    jobdep_operator, jobdep_status, jobdep_joblogic, jobdep_ingroup, jobdep_dateoffset, jobdep_instoffset,
    jobdep_canignore, jobdep_filename, jobdep_filetype, jobdep_fileextent, nodmst_id, varmst_id, jobdep_value
    FROM Jobdep jd
    INNER JOIN Jobmst jm ON jd.jobmst_id = jm.jobmst_id
    INNER JOIN Jobmst jm1 ON jd.jobdep_jobmst = jm1.jobmst_id
    WHERE jm.jobmst_id = 9878""")

在数据库上运行良好,但在django,我得到以下失败-

原始查询必须包含主键

此模型的主键是“jobdep_id”,如这里的models.py所示-

class Jobdep(models.Model):
    jobdep_id = models.IntegerField(primary_key=True)

Tags: keyid数据库modelsjdinnerjoin主键
3条回答

如果使用Manager.raw(),则需要提供id.(https://docs.djangoproject.com/en/2.2/topics/db/sql/#performing-raw-sql-queries

There is only one field that you can’t leave out - the primary key field. Django uses the primary key to identify model instances, so it must always be included in a raw query. An InvalidQuery exception will be raised if you forget to include the primary key.

但是可以直接执行自定义SQL来避免这种情况。有关Django文档的更多信息 https://docs.djangoproject.com/en/2.2/topics/db/sql/#executing-custom-sql-directly

尝试将查询编写为:

"SELECT jobdep_id AS id ..."

也许有帮助。

问题确实是我的模型。py我必须更新如下-

class Jobdep(models.Model):
    jobdep_id = models.IntegerField(db_column='jobdep_id', primary_key=True)

相关问题 更多 >