【发布时间】:2019-06-29 11:27:27
【问题描述】:
我在 django 1.11 上运行应用程序并作为 Oracle Database 11G XE 数据库引擎。我有 3 个表 producto、catalogo 和 catalogo_producto。 catalogo_producto 表是producto 和catalogo 之间的中间表。迁移表的时候没有问题,但是想创建对象的时候出现如下错误django.db.utils.DatabaseError: ORA-00904: "CATALOGO_PRODUCTO". "ID": invalid identifier.
我知道这个错误是指我没有在模型中分配任何主键,但是遵循 django 文档Extra fields on many-to-many relationships 对于这些情况,主键没有分配给特定字段。我也明白,在这些情况下,django 会创建一个模型中未显示的 PK“ID”。所以我不知道正确的解决方案是简单地在catalogo_producto表中创建一个id字段还是有其他解决方案?
models.py
class Producto(models.Model):
codigo = models.IntegerField(primary_key=True)
precio = models.IntegerField()
nombre = models.CharField(max_length=100)
tipo = models.CharField(max_length=25)
cantidad = models.IntegerField()
class Meta:
db_table = 'producto'
def __str__(self):
return str(self.codigo)
class Catalogo(models.Model):
codigo = models.AutoField(primary_key=True)
descripcion = models.CharField(max_length=250)
fecha = models.DateField()
productos = models.ManyToManyField(Producto, through='CatalogoProducto')
class Meta:
db_table = 'catalogo'
def __str__(self):
return str(self.codigo)
class CatalogoProducto(models.Model):
catalogo_codigo = models.ForeignKey(Catalogo, models.DO_NOTHING, db_column='catalogo_codigo')
producto_codigo = models.ForeignKey(Producto, models.DO_NOTHING, db_column='producto_codigo')
posicion = models.IntegerField()
precio = models.IntegerField()
imagen_producto = models.ImageField(upload_to="images/", default='')
class Meta:
db_table = 'catalogo_producto'
unique_together = (('catalogo_codigo', 'producto_codigo'),)
DDL 预言机
CREATE TABLE producto (
codigo NUMBER(6) NOT NULL,
precio NUMBER(8) NOT NULL,
nombre VARCHAR2(100) NOT NULL,
tipo VARCHAR2(25) NOT NULL,
cantidad NUMBER(6) NOT NULL
);
ALTER TABLE producto ADD CONSTRAINT producto_pk PRIMARY KEY ( codigo );
CREATE TABLE catalogo (
codigo NUMBER(6) NOT NULL,
descripcion VARCHAR2(250) NOT NULL,
fecha DATE NOT NULL);
ALTER TABLE catalogo ADD CONSTRAINT catalogo_pk PRIMARY KEY ( codigo );
CREATE TABLE catalogo_producto (
catalogo_id NUMBER(6) NOT NULL,
producto_id NUMBER(6) NOT NULL,
posicion NUMBER(4) NOT NULL,
precio NUMBER(8) NOT NULL,
imagen_producto VARCHAR2(250) NOT NULL
);
ALTER TABLE catalogo_producto ADD CONSTRAINT catálogo_producto_pk PRIMARY KEY(catalogo_id, producto_id);
ALTER TABLE catalogo_producto
ADD CONSTRAINT cat_prod_catalogo_fk FOREIGN KEY ( catalogo_id )
REFERENCES catalogo ( codigo );
ALTER TABLE catalogo_producto
ADD CONSTRAINT cat_prod_producto_fk FOREIGN KEY ( producto_id )
REFERENCES producto ( codigo );
【问题讨论】:
-
您如何尝试在 CatalogoProducto 中创建记录?当您使用直通模型时,您必须手动创建对象...
-
首先我创建了一个产品然后是一个目录,当我尝试在 CatalogoProducto 中创建记录时出现错误。我通过管理员所做的一切。
-
您能否提供Oracle 中表
catalogo_producto的表描述(所有列和约束的列表)。主键列应由 Django 自动创建,名称为“ID”。您可以覆盖它,但这不是必需的。这个表以前存在吗?你是否运行过 makemigrations/migrate 没有错误? -
@Risadinha 当我进行迁移时,没有发生错误。仅当我尝试从管理员那里在 CatalogoProducto 中添加记录时。我已经共享了 oracle DDL
标签: python django-models oracle11g many-to-many