Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Django壳牌ORA-00904_Sql_Django_Oracle_Django Models - Fatal编程技术网

Sql Django壳牌ORA-00904

Sql Django壳牌ORA-00904,sql,django,oracle,django-models,Sql,Django,Oracle,Django Models,我有一个oracle遗留数据库,其中包含字段。如果我运行Orders.objects.count(),我会得到正确的数量。当我运行Orders.object.all()时,我得到了这个错误,但还没有在线找到解决方案 类订单(models.Model): account\u obj\u db=models.BigIntegerField(blank=True,null=True) account\u obj\u id0=models.BigIntegerField(blank=True,null=

我有一个oracle遗留数据库,其中包含字段。如果我运行Orders.objects.count(),我会得到正确的数量。当我运行Orders.object.all()时,我得到了这个错误,但还没有在线找到解决方案

类订单(models.Model):

account\u obj\u db=models.BigIntegerField(blank=True,null=True)

account\u obj\u id0=models.BigIntegerField(blank=True,null=True)

account\u obj\u type=models.CharField(max\u length=1020,blank=True,null=True)

account\u obj\u rev=models.bigingerfield(blank=True,null=True)

order\u payload\u buf\u size=models.BigIntegerField(blank=True,null=True)

total\u authority\u count=models.BigIntegerField(blank=True,null=True)

currency\u code=models.BigIntegerField(blank=True,null=True)

>>从主页。型号导入订单

>Orders.objects.all()

回溯(最近一次呼叫最后一次):
文件“/home/user/dev2/lib/python3.5/site-packages/django/db/backends/utils.py”,第64行,执行
返回self.cursor.execute(sql,params)
文件“/home/user/dev2/lib/python3.5/site-packages/django/db/backends/oracle/base.py”,第481行,执行
返回self.cursor.execute(查询,self.param\u生成器(params))

cx_Oracle.DatabaseError:ORA-00904:“订单”。“ID”:无效标识符

这里的问题是,当您没有为您的模型分配主键时,Django将创建一个未在模型上显示的“ID”PK字段

但是,当您在模型的Meta中设置<代码>托管=false <代码>(我假设您这样做)时,Django将不会在数据库中创建/管理该表,这意味着它不会创建基础ID-PK字段,但模型级别仍然认为它存在(可以考虑这一错误并报告它),并尝试用它进行查询,因此ORA错误

解决方案是在您的模型中手动设置与数据库中相同的PK字段,比如说,
account\u obj\u db
是传统数据库中订单的PK字段,只需在模型中添加主键即可。py:

class Orders(models.Model):
    account_obj_db = models.BigIntegerField(primary_key = true, blank=True, null=True)
    account_obj_id0 = models.BigIntegerField(blank=True, null=True)
    account_obj_type = models.CharField(max_length=1020, blank=True, null=True)
    account_obj_rev = models.BigIntegerField(blank=True, null=True)
    order_payload_buf_size = models.BigIntegerField(blank=True, null=True)
    total_entitlement_count = models.BigIntegerField(blank=True, null=True)
    currency_code = models.BigIntegerField(blank=True, null=True) 
在此之后,您可能需要进行另一次迁移


还要注意缩进

请添加一些示例行,例如模型和数据库表不匹配,您可以迁移以确保它们匹配,也可以编辑模型,例如数据库中的表,因为我的表没有主键。我相信Django正在创建ID字段。在文档中,我看不到绕过自动字段的方法。有什么想法吗@Mojimi@AlleeClark我对遗留数据库也有类似的问题,因此,如果需要主键,在数据库中表的一个字段上创建该约束,并将primary_key=true参数添加到模型中的同一字段,则可能需要迁移again@Mojimi你是对的。我必须添加主键。我不确定您是否想添加答案供我选择。它将帮助那些努力从遗留数据库序列化数据的人。