2017-02-02 14 views
1

フィールドを持つOracleのレガシーデータベースがあります。 Orders.objects.count()を実行すると、正しい量が得られます。 Orders.object.all()を実行するとこのエラーが発生しますが、解決策はオンラインでは見つかりませんでした。Django shell ORA-00904

class Orders(models.Model):
account_obj_db = models.BigIntegerField(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)

>>> from home.models import Orders
>>> Orders.objects.all()
トレースバック(最新の呼び出しの最後):
実行
で ファイル "/home/user/dev2/lib/python3.5/site-パッケージ/ジャンゴ/ DB /バックエンド/ utils.py"、ライン64、 return self.cursor.execute(sql、params)
ファイル「/home/user/dev2/lib/python3.5/site-packages/django/db/backends/oracle/base.py」481行目ORA-00904::。 "ORDERS" "ID":ここでは無効な識別子

+0

が – e4c5

+0

がモデルと一致していないデータベーステーブルのような音いくつかのサンプル行を追加してくださいインデント見るこの

後に別の移行を行う必要があるかもしれません、あなたは彼らがしていることを確認するために移行しますか、データベース内のテーブルのようにモデルを照合または編集する – Mojimi

+0

私のテーブルには主キーがないので、DjangoがIDフィールドを作成していると思います。ドキュメントでは、私はautofieldの周りの方法を参照してください。何か案が? @Mojimi –

答えて

1

問題がとき、ということである
リターンself.cursor.execute(クエリ、self._param_generator(のparams))
cx_Oracle.DatabaseErrorを実行しますあなたはDjangoはモデルに表示されていない "ID" PKフィールドを作成します。

しかし、モデルのメタでmanaged = falseを設定した場合、Djangoはデータベース内にこのテーブルを作成/管理しません。つまり、基礎となるID pkフィールドは作成されませんが、モデルレベルではまだ考えられますORAエラー

解決策は、データベースにあるように手動で同じPKフィールドをモデル内に手動で設定することです(例:これはバグと報告することができます) account_obj_dbは、レガシーデータベースのOrdersのPKフィールドです。あなたのmodels.pyにprimary_keyを追加するだけです。

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) 

あなたはまた、あなたが