2017-09-27 3 views
1

Comme le titre le suggère, je joue avec l'utilisation d'une table existante pour le AUTH_USER_MODEL en utilisant AbstractUser. Avoir à --fake la migration. Toutes les colonnes supplémentaires que je dois ajouter à la base de données manuellement, puis au modèle que certaines erreurs apparaissent. Pas idéal.Utiliser la table existante pour AUTH_USER_MODEL est-il possible pour un nom de champ de modèle Django de faire référence au nom de champ de base de données différent

Quoi qu'il en soit, quand je suis arrivé à ./manage.py createsuperuser-je obtenir des erreurs liées à des domaines non existants: il faut is_superuser, is_staff, etc. La chose est qu'il ya des champs de la table pour déjà, ont juste un nom légèrement différent. Je pourrais juste changer le nom. Mais j'ai commencé à me demander s'il y avait quelque chose de intégré dans Django pour convertir un nom de champ ORM en un nom de champ de table. Quelque chose comme:

class Meta: 
    db_table = 'Users' 

Où Django prend le nom, sauf indication contraire.

Mon bref aperçu de la documentation n'a pas immédiatement donné quelque chose.

https://docs.djangoproject.com/en/1.11/ref/models/options/

from django.db import models 
from django.contrib.auth.models import AbstractUser 

# Create your models here. 

# Extend the User model 
class User(AbstractUser): 
    id = models.AutoField(primary_key=True) 
    username = models.CharField(max_length=255, blank=False, null=False, unique=True) 
    first_name = models.CharField(max_length=255, blank=True, null=True) 
    last_name = models.CharField(max_length=255, blank=True, null=True) 
    email = models.CharField(max_length=255, blank=True, null=True) 
    phone = models.CharField(max_length=255, blank=True, null=True) 
    password = models.CharField(max_length=255, blank=True, null=True) 
    cono = models.IntegerField(blank=False, null=False) 
    ip_whitelist_1 = models.CharField(max_length=32, blank=True, null=True) 
    ip_whitelist_2 = models.CharField(max_length=32, blank=True, null=True) 
    ip_whitelist_3 = models.CharField(max_length=32, blank=True, null=True) 
    last_login = models.DateTimeField(blank=True, null=True) 
    password_changed = models.DateField(blank=True, null=True) 
    security_q1 = models.CharField(max_length=255, blank=True, null=True) 
    security_q2 = models.CharField(max_length=255, blank=True, null=True) 
    security_a1 = models.CharField(max_length=255, blank=True, null=True) 
    security_a2 = models.CharField(max_length=255, blank=True, null=True) 
    role = models.IntegerField(blank=True, null=True) 
    login_unlock_date = models.DateTimeField(blank=True, null=True) 
    challenge_unlock_date = models.DateTimeField(blank=True, null=True) 
    active = models.SmallIntegerField(blank=True, null=True) 
    updated = models.DateTimeField(blank=True, null=True) 
    created = models.DateTimeField(blank=True, null=True) 

    # having to add these 
    is_superuser = models.SmallIntegerField(blank=True, null=True) 
    is_staff = models.SmallIntegerField(blank=True, null=True) 
    is_active = models.SmallIntegerField(blank=True, null=True) 


    REQUIRED_FIELDS = [] 
    USERNAME_FIELD = 'username' 
    is_anonymous = False 
    is_authenticated = True 

    class Meta: 
     db_table = 'Users' 

Répondre

1

vous pouvez essayer d'utiliser l'option db-column:

# having to add these 
    is_superuser = models.SmallIntegerField(db_column="YOU_NAME1", blank=True, null=True) 
    #           ^^^^^^ 
    is_staff = models.SmallIntegerField(db_column="YOU_NAME2", blank=True, null=True) 
    #           ^^^^^^ 
    is_active = models.SmallIntegerField(db_column="YOU_NAME3", blank=True, null=True) 
    #           ^^^^^^