2013-07-04 12 views
6

Sto lavorando a un progetto Django 1.5 e ho un modello utente personalizzato (chiamiamolo CustomUser). Un'altra app (SomeApp) deve fare riferimento a questo modello utente personalizzato. Ai fini della ForeignKey e simili, la documentazione Django dice di usareDjango 1.5: Accesso ai campi del modello utente personalizzato in models.py

User = settings.AUTH_USER_MODEL 

Tuttavia, alcune funzioni in SomeApp.models necessità di accedere a quello che sarebbe stato precedentemente noto come User.objects. Ma Utente ora è una stringa e non una classe, quindi User.objects non riesce. L'alternativa sarebbe

from django.contrib.auth import get_user_model 
User = get_user_model() 

che funziona in altri moduli, ma quando uso questo models.py di SomeApp, Django genera un errore:

ImproperlyConfigured("AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL)

Tutte le idee?

EDIT 1 - Traceback:

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "...\django-badger\badger\__init__.py", line 7, in <module> 
    from badger.models import Badge, Award, Progress 
    File "...\django-badger\badger\models.py", line 26, in <module> 
    User = get_user_model() 
    File "...\lib\site-packages\django\contrib\auth\__init__.py", line 127, in get_user_model 
    raise ImproperlyConfigured("AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL) 
ImproperlyConfigured: AUTH_USER_MODEL refers to model 'MyApp.AuthUser' that has not been installed 

EDIT 2 - INSTALLED_APPS impostazioni:

INSTALLED_APPS = (
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.admin', 
'django.contrib.admindocs', 
'south', 
'MyApp', # this is where my user model is defined 
'SomeApp', # I try to use get_user_model() in this app's models.py; doesn't work. 
'social_auth', 
) 
+0

È possibile caricare il traceback completo? – jpic

+0

Come hai definito "AUTH_USER_MODEL" nelle tue impostazioni? In quale applicazione è l'utente e qual è il nome della classe per esso? – matino

+0

@matino - sì, è definito nelle impostazioni. get_user_model() funziona bene in tutti gli altri file tranne models.py. Il mio modello utente personalizzato AuthUser è definito in MiaApp (in questo esempio) – askvictor

risposta

0

È necessario impostare,

AUTH_USER_MODEL = "yourapp.CustomUser"

nel settings.py. Quindi il get_user_model() funzionerà. C'è un pulito documentation available.

+0

Lo è già. get_user_model() funziona in altri file tranne models.py. – askvictor

+0

Controlla l'ordine del tuo 'INSTALLED_APPS'. L'app che contiene il 'CustomUser' dovrebbe essere al massimo delle altre app. La spiegazione dettagliata è qui, https://code.djangoproject.com/ticket/19218 – Babu

0

sto iniziando a pensare che una soluzione potrebbe essere in ordine - eventuali osservazioni sul seguente in SomeApp/models.py:

from django.contrib.auth.models import User as UserModel 
try: 
    from django.contrib.auth import get_user_model 
except ImportError: #django <= 1.4 doesn't have get_user_model so define our own 
    def get_user_model(): 
     return UserModel 
User = getattr(settings, 'AUTH_USER_MODEL', 'auth.User') 
... 
def SomeModel(models.Model): 
    user = models.ForeignKey(User) # using the name of the model 
    def some_method(self, email): 
     qs = get_user_model().objects.filter(email=email) # using function call to get model class 
+0

Hey @askvictor, come sei riuscito a risolvere questo? Sto riscontrando lo stesso problema, ma durante l'esecuzione delle migrazioni e su un pacchetto che viene installato dopo la mia app. – tzenderman

+0

@tzenderman - risolto mettendo il progetto in attesa mentre: -/Per le migrazioni, ho avuto alcuni problemi correlati che ho risolto creando una migrazione intermedia insieme a needed_by o depends_on: http: // stackoverflow.it/questions/17711515/django-south-circular-dependency – askvictor

3

Assicurarsi che il modello di utente personalizzato non è astratta.

1

Penso che questa importazione da SomeApp effettui un'importazione circolare. Ecco perché c'è una dichiarazione in docs per fare qualcosa come ForeignKey con l'attributo delle impostazioni di chiamata.

Per quanto mi riguarda, mi sono imbattuto in questa cosa quando ho usato l'app django-filer. C'era un commit su github per impedire le importazioni con get_user_model(). Puoi usare il codice lì come un esempio per risolvere il problema.

Questo problema è molto complicato, perché quando si tenta di chiamare get_user_model() dalla shell, funzionerebbe.

8

Ho avuto lo stesso problema solo ora e qui è il mio 2 centesimi/soluzione.

Se si desidera utilizzare il modello utente personalizzata in models.py che verrà usato per le chiavi esterne settings.AUTH_USER_MODEL e per i metodi del modello è necessario utilizzare get_user_model() ma deve essere all'interno il metodo. Non funzionerà all'esterno a causa dell'importazione circolare.

+2

Questa è la risposta definitiva. Grazie Freon! –

10

Facile, penso. Ho avuto così tanti problemi con le inclusioni ricorsive e così via ... Beh, la cosa più semplice da fare, quando si aggiunge un ForeignKey, è quello di scrivere in questo modo:

user = models.ForeignKey(settings.AUTH_USER_MODEL, null=False, on_delete=models.CASCADE, verbose_name=_(u"User")) 

Se si utilizza get_user_model, non utilizzarlo come si fa. Chiamando

User = get_user_model() 

nella parte superiore del modulo cercherà di importare il modello di User, che può, infatti, non sono stati "installato". Invece, si hanno diverse scelte:

  • Nella parte superiore del modulo, scrivere

    utente = get_user_model # allora, si dovrà utilizzare per l'utente() al posto di utente

  • Write get_user_model() ovunque sia utile. Sempre in metodi o funzioni, mai direttamente nel corpo di un modulo modello.

+0

Questo ha funzionato per me. Stavo importando get_user_model() nella parte superiore del file. Ha senso. Grazie – Howie

+0

Come gestiresti questo problema nel codice dichiarativo? Ad esempio, una classe UserSerializer ha una classe Meta in cui è specificato il modello. Non è possibile rinviare la definizione del modello utente al tempo di esecuzione, poiché l'intera definizione viene analizzata durante il tempo di importazione. – dangonfast

0

Corri verso Sud 0.8.3?

Assicurarsi di esecuzione del Sud almeno 0.8.4

GitHub issue Sud uscita Notes

1

La documentazione Django ha la risposta: https://docs.djangoproject.com/en/dev/topics/auth/customizing/#django.contrib.auth.get_user_model

La sezione più rilevanti: generale , dovresti fare riferimento al modello Utente con l'impostazione AUTH_USER_MODEL nel codice che viene eseguito al momento dell'importazione. get_user_model() funziona solo una volta che Django ha importato tutti i modelli.

La vera soluzione è assicurarsi di utilizzare solo get_user_model() all'interno di un metodo, in modo che non venga eseguito al momento dell'importazione.

Problemi correlati