2009-05-14 6 views
1

Nous lançons django - et partageons une base de données avec - une application existante. Et nous voulons utiliser une table "utilisateur" existante (pas celle de Django) pour stocker les informations utilisateur.Dans Django, comment pouvez-vous changer la classe User pour travailler avec une table db différente?

Il semble qu'il soit possible de changer le nom de la table que Django utilise, dans la classe Meta de la définition de l'utilisateur.

Mais nous préférerions ne pas changer le noyau Django lui-même.

Nous pensions que nous pouvions sous-classe la classe auth.User de base comme celui-ci:

class OurUser(User) : 
    objects = UserManager() 
    class Meta: 
     db_table = u'our_user_table' 

Ici, le but est de ne pas ajouter des champs supplémentaires à la classe personnalisée de l'utilisateur. Mais juste pour utiliser la table alternative.

Cependant, cela ne fonctionne pas (probablement parce que le ORM est en supposant que le our_user_table devrait avoir une clé étrangère faisant référence à la table de l'utilisateur d'origine, qu'il ne fonctionne pas).

Alors, est-ce que c'est une façon sensée de faire ce que nous voulons faire? Ai-je manqué un moyen plus facile de mapper des classes sur des tables? Ou, si non, cela peut-il fonctionner?

Mise à jour:

Je pense que je pourrais être en mesure de faire le changement que je veux juste par « singe-patcher » le _meta de l'utilisateur dans un local_settings.py

User._meta.db_table = 'our_user_table' 

Quelqu'un peut-il penser à quoi que ce soit mauvais qui pourrait arriver si je fais ça? (Particulièrement dans le contexte d'une application Django/Pinax assez typique?)

Répondre

6

Vous pourriez trouver utile de configurer votre ancienne table comme alternative authentication source et de contourner tous ces problèmes.

Une autre option est de subclass the user et ont le point de sous-classe à votre modèle utilisateur. Remplacez la fonction de sauvegarde pour vous assurer que tout ce que vous devez faire pour préserver votre ancienne fonctionnalité est là.

Je n'ai pas fait moi-même l'un ou l'autre mais j'espère que ce sont des pointeurs utiles.

Mise à jour Ce que je veux dire par l'authentification de remplacement dans ce cas est un petit script python qui dit: « Oui, c'est un nom d'utilisateur valide/mot de passe » - Il crée ensuite une instance de modèle dans la table Django standard, copies champs en face de la table héritée et renvoie le nouvel utilisateur à l'appelant.

Si vous avez besoin de garder les deux tables de synchronisation, vous pouvez décider d'avoir votre authentification de substitution jamais créer un utilisateur standard django et juste dire « Oui, c'est un mot de passe valide et le nom d'utilisateur »

+0

1 d'authentification alternative la source. –

+0

Configurer un backend qui fait ce dont vous avez besoin est la manière standard et recommandée d'utiliser d'autres sources auth avec Django, c'est ce que cette personne devrait faire. En outre, une recherche rapide sur Google se révèle un certain nombre de backends authentiques dans la nature qui peuvent être utilisés comme exemples :) –

+0

Merci. Peut-être que je n'étais pas assez clair mais c'est exactement ce que nous essayons de faire. (C'est-à-dire utiliser une authentification alternative et une sous-classe de l'utilisateur).Le problème est que, en créant une sous-classe, l'ORM s'attend maintenant à ce que la table personnalisée (notre table héritée) ait un champ qui est une clé étrangère à la table originale django auth_user. Et il jette une erreur parce que cela n'existe pas. – interstar

Questions connexes