web-dev-qa-db-fra.com

Comment utiliser 'User' comme clé étrangère dans Django 1.5

J'ai créé un modèle de profil personnalisé qui ressemble à ceci:

from Django.db import models
from Django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.ForeignKey('User', unique=True)
    name = models.CharField(max_length=30)
    occupation = models.CharField(max_length=50)
    city = models.CharField(max_length=30)
    province = models.CharField(max_length=50)
    sex = models.CharField(max_length=1)

Mais quand je lance manage.py syncdb, Je reçois:

myapp.userprofile: 'user' a une relation avec le modèle User, qui n'a pas été installé ou est abstrait.

J'ai aussi essayé:

from Django.contrib.auth.models import BaseUserManager, AbstractUser

Mais cela donne la même erreur. Où je me trompe et comment y remédier?

48
supermario

Change ça:

user = models.ForeignKey('User', unique=True)

pour ça:

user = models.ForeignKey(User, unique=True)
53
Captain Skyhawk

Exactement en Django 1.5 le AUTH_USER_MODEL setting a été introduit , permettant d'utiliser un modèle utilisateur personnalisé avec le système d'authentification.

Si vous écrivez une application destinée à fonctionner avec des projets sur Django 1.5 à 1.10 et versions ultérieures, c'est la bonne façon de référencer le modèle utilisateur (qui peut maintenant être différent de Django.contrib.auth.models.User):

class UserProfile(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
  • Voir docs pour plus de détails.

Dans le cas où vous écrivez une application réutilisable prenant en charge Django 1.4 également, alors vous devriez probablement déterminer la référence à utiliser en vérifiant la version Django, peut-être comme ceci :

import Django
from Django.conf import settings
from Django.db import models


def get_user_model_fk_ref():
    if Django.VERSION[:2] >= (1, 5):
        return settings.AUTH_USER_MODEL
    else:
        return 'auth.User'


class UserProfile(models.Model):
    user = models.ForeignKey(get_user_model_fk_ref())
60
Anton Strogonoff