0

Actuellement, j'ai une application héritée qui fait référence à une table user avec tous les champs personnalisés. Comme il y a une bonne quantité de code hérité se référant à cette table, je ne peux pas simplement renommer cette table comme auth_user. Donc, la chose que j'essaie de faire est en quelque sorte fusionner (je ne sais pas que c'est le bon terme) auth_user et user.fusionner auth_user django avec la table utilisateur existante

est user tableau ci-dessous:

+-------------------+--------------+------+-----+---------+----------------+ 
| Field    | Type   | Null | Key | Default | Extra   | 
+-------------------+--------------+------+-----+---------+----------------+ 
| user_id   | int(10)  | NO | PRI | NULL | auto_increment | 
| name    | varchar(100) | NO |  | NULL |    | 
| address   | varchar(100) | NO |  | NULL |    | 
| phone_no   | varchar(15) | NO |  | NULL |    | 
| city    | varchar(100) | NO |  | NULL |    | 
| state    | varchar(100) | NO |  | NULL |    | 
| pin_no   | int(10)  | NO |  | NULL |    | 
| type    | varchar(100) | NO |  | NULL |    | 
| email    | varchar(100) | NO |  | NULL |    | 
| password   | varchar(100) | NO |  | NULL |    | 
| is_active   | tinyint(1) | NO |  | NULL |    | 
| role    | varchar(40) | NO |  | NULL |    | 
| creation_date  | int(100)  | NO |  | NULL |    | 
| edit_date   | int(100)  | NO |  | NULL |    | 
| country   | varchar(255) | NO |  | NULL |    | 
| district   | varchar(255) | NO |  | NULL |    | 
| ip    | varchar(255) | NO |  | NULL |    | 
| added_by   | int(11)  | NO |  | NULL |    | 
| is_phone_verified | binary(1) | NO |  | 0  |    | 
| remember_token | varchar(100) | YES |  | NULL |    | 
| disclaimer_agreed | int(11)  | YES |  | 0  |    | 
| mobile_login  | tinyint(4) | NO |  | 0  |    | 
+-------------------+--------------+------+-----+---------+----------------+ 

et table django auth_user:

+--------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+--------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| password  | varchar(128) | NO |  | NULL |    | 
| last_login | datetime(6) | YES |  | NULL |    | 
| is_superuser | tinyint(1) | NO |  | NULL |    | 
| username  | varchar(150) | NO | UNI | NULL |    | 
| first_name | varchar(30) | NO |  | NULL |    | 
| last_name | varchar(30) | NO |  | NULL |    | 
| email  | varchar(254) | NO |  | NULL |    | 
| is_staff  | tinyint(1) | NO |  | NULL |    | 
| is_active | tinyint(1) | NO |  | NULL |    | 
| date_joined | datetime(6) | NO |  | NULL |    | 
+--------------+--------------+------+-----+---------+----------------+ 

Ce que je veux est une seule table, qui django fera référence à l'utilisation de contrib.auth choses liées et aussi à en même temps ne déprécie pas mon code hérité. peut-être quelque chose comme ceci:

+-------------------+--------------+------+-----+---------+----------------+ 
| Field    | Type   | Null | Key | Default | Extra   | 
+-------------------+--------------+------+-----+---------+----------------+ 
| user_id   | int(10)  | NO | PRI | NULL | auto_increment | 
| name    | varchar(100) | NO |  | NULL |    | 
| address   | varchar(100) | NO |  | NULL |    | 
| phone_no   | varchar(15) | NO |  | NULL |    | 
| city    | varchar(100) | NO |  | NULL |    | 
| state    | varchar(100) | NO |  | NULL |    | 
| pin_no   | int(10)  | NO |  | NULL |    | 
| type    | varchar(100) | NO |  | NULL |    | 
| email    | varchar(100) | NO |  | NULL |    | 
| password   | varchar(100) | NO |  | NULL |    | 
| is_active   | tinyint(1) | NO |  | NULL |    | 
| role    | varchar(40) | NO |  | NULL |    | 
| creation_date  | int(100)  | NO |  | NULL |    | 
| edit_date   | int(100)  | NO |  | NULL |    | 
| country   | varchar(255) | NO |  | NULL |    | 
| district   | varchar(255) | NO |  | NULL |    | 
| ip    | varchar(255) | NO |  | NULL |    | 
| added_by   | int(11)  | NO |  | NULL |    | 
| is_phone_verified | binary(1) | NO |  | 0  |    | 
| remember_token | varchar(100) | YES |  | NULL |    | 
| disclaimer_agreed | int(11)  | YES |  | 0  |    | 
| mobile_login  | tinyint(4) | NO |  | 0  |    | 
| last_login  | datetime(6) | YES |  | NULL |    | 
| is_superuser  | tinyint(1) | NO |  | NULL |    | 
| username   | varchar(150) | NO | UNI | NULL |    | 
| first_name  | varchar(30) | NO |  | NULL |    | 
| last_name   | varchar(30) | NO |  | NULL |    | 
| is_staff   | tinyint(1) | NO |  | NULL |    | 
| is_active   | tinyint(1) | NO |  | NULL |    | 
| date_joined  | datetime(6) | NO |  | NULL |    | 
+-------------------+--------------+------+-----+---------+----------------+ 

Le motif est ici pour profiter du système builtin authentication et permission de Django, mais sans casser le code existant. Je pense qu'il doit y avoir une solution pour cela, car ce n'est pas la première fois que quelqu'un porte une application héritée sur django.

Je voudrais également mentionner ce lien How to Extend Django User Model, mais je ne suis pas sûr quelle approche est la meilleure à adopter ou devrais-je faire quelque chose de complètement différent

+1

Je ne comprends pas pourquoi vous voulez les fusionner. Pourquoi ne pas ajouter une relation un-à-un entre eux? –

+0

la table 'auth_user' n'est pas remplie, alors que j'ai beaucoup d'entrées dans la table' user'. Faire aussi une relation un-à-un signifierait que j'aurai peut-être besoin d'utiliser des jointures à un moment donné, ce qui pourrait mal se passer avec les sérialiseurs/viewsets existants de restframework –

+0

Cela ne veut toujours pas dire que vous devez les fusionner , cela signifie que vous devez utiliser votre propre modèle personnalisé, qui est bien documenté. –

Répondre

1

Django soutient explicitement les modèles utilisateur personnalisés. Créez un modèle pour votre table existante, faites en hériter à partir de AbstractBaseUser et définissez le paramètre AUTH_USER_MODEL pour pointer vers votre nouveau modèle. Voir le comprehensive docs.

+0

C'est vraiment utile, mais cela indique clairement que - N'oubliez pas de pointer AUTH_USER_MODEL. Faites-le avant de créer des migrations ou d'exécuter manage.py pour la première fois »- Je suis déjà au-delà de cette étape. Si je change cela maintenant, quel effet cela aura-t-il? Est-ce que je devrais simplement laisser tomber ces tables créer dans l'étape ci-dessus et pointer alors 'AUTH_USER_MODEL' à lui et réexécuter de nouvelles migrations? –

+0

Oui, si vous êtes encore en développement, la meilleure chose à faire serait de supprimer la base de données, de supprimer les migrations, puis de les créer à nouveau. –