2009-09-04 6 views
0

J'essaie d'intégrer une base de données héritée dans Django.Django et les tables de base de données héritées bizarres

Je rencontre des problèmes avec certaines tables bizarres qui résultent d'une conception de base de données horriblement mauvaise, mais je ne suis pas libre de le changer. Le problème est qu'il existe des tables qui n'ont pas d'ID de clé primaire, mais un ID de produit et, voici le problème, beaucoup d'entre eux sont multiples dans le cas où une colonne doit avoir plusieurs valeurs, par exemple

ID | ... | namestring 

2 | ... | name1 
2 | ... | name2 

Est-il possible de contourner le comportement primarykey habituelle et écrire une fonction qui retourne un objet pour un tel ID avec plusieurs lignes? La chaîne de noms de colonnes pourrait alors devenir une liste.

Il n'y a pas d'édition manuelle nécessaire, car cela est exporté des données d'un autre système, je viens d'y accéder ..

Répondre

2

ORM de Django aura du mal à travailler avec cette table, sauf si vous ajoutez une colonne clé primaire unique.

Si vous ajoutez une clé primaire, il serait alors trivial d'écrire une méthode pour interroger un ID de produit donné et renvoyer une liste des valeurs correspondant à cet ID de produit. Quelque chose comme:

def names_for(product_id): 
    return [row.namestring for row in ProductName.objects.filter(product_id=product_id)] 

Cette fonction pourrait également être une méthode de gestion personnalisé, ou une méthode sur votre modèle de produit, ou tout ce qui fait de vous plus de sens.

EDIT: En supposant que vous avez un modèle de produit que le product_id dans ce tableau fait référence, et l'utilisation que vous aurez pour cette table est de rechercher ces noms pour un produit donné, votre autre option est de laissez cette table complètement hors de l'ORM, et écrivez juste une méthode sur le produit que uses raw SQL and cursor.execute pour chercher les noms pour ce produit. C'est agréable et propre et ne nécessite pas d'ajouter un PK unique à la table. La principale chose que vous perdez est la possibilité d'administrer cette table via les modelforms Django ou l'admin.

+0

OK, merci, cela semble être une solution raisonnable. Je serais heureux cependant s'il y avait un moyen de contourner l'accès réel de l'objet d'une certaine façon via un gestionnaire ou quelque chose comme ça? –

Questions connexes