2017-02-02 4 views
1

J'ai une base de données héritée d'Oracle qui a des champs. Si je cours Orders.objects.count() j'obtiens le montant correct. Quand je cours Orders.object.all() j'obtiens cette erreur mais n'ai pas trouvé une solution en ligne.Shell Django 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()
retraçage (appel le plus récent en dernier):
fichier "paquets /home/user/dev2/lib/python3.5/site-/django/db/backend/utils.py", ligne 64, à exécuter
return self.cursor.execute (sql, params)
Fichier "/home/user/dev2/lib/python3.5/site-packages/django/db/standends/oracle/base.py", ligne 481, dans exécuter
self.cursor.execute de retour (requête, self._param_generator (params))
cx_Oracle.DatabaseError: ORA-00904: "COMMANDES" "ID":. identifiant invalide

+0

S'il vous plaît ajouter quelques lignes d'échantillons – e4c5

+0

Les sons comme les modèles et la table de base de données ne sont pas identiques, vous pouvez migrer pour vous assurer qu'ils sont faire correspondre ou modifier les modèles comme la table dans votre base de données – Mojimi

+0

Depuis ma table n'a pas de clé primaire, je crois que Django crée le champ ID. Dans la documentation, je ne vois pas un moyen de contourner les autofields. Une idée? @Mojimi –

Répondre

1

Le problème ici est que, lorsque vous n'attribuez pas de clé primaire de vos modèles, Django crée un champ PK "ID" qui n'apparaît pas sur les modèles. Mais lorsque vous définissez managed = false (je suppose que vous l'avez fait) dans la méta de votre modèle, Django ne crée/gère pas cette table dans la base de données, ce qui signifie qu'il ne créera pas le champ ID. existe (vous pourriez considérer cela comme un bogue et le signaler) et tente d'effectuer des requêtes, d'où l'erreur ORA

La solution est de définir manuellement le même champ PK dans vos modèles que vous avez dans votre base de données, disons account_obj_db est le champ PK de Orders dans votre base de données existante, ajoutez simplement la clé primaire à celui-ci dans vos modèles.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) 

Vous pourriez avoir besoin de faire une autre migration après cette

montre également votre indenter