How to use 'User' as foreign key in Django 1.5

PythonPython 3.xDjangoForeign KeysDjango Users

Python Problem Overview


I have made a custom profile model which looks like this:

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)

But when I run manage.py syncdb, I get:

> myapp.userprofile: 'user' has a relation with model User, which has > either not been installed or is abstract.

I also tried:

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

But it gives the same error. Where I'm wrong and how to fix this?

Python Solutions


Solution 1 - Python

Exactly in Django 1.5 the AUTH_USER_MODEL setting was introduced, allowing using a custom user model with auth system.

If you're writing an app that's intended to work with projects on Django 1.5 through 1.10 and later, this is the proper way to reference user model (which can now be different from django.contrib.auth.models.User):

class UserProfile(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
  • See docs for more details.

In case you're writing a reusable app supporting Django 1.4 as well, then you should probably determine what reference to use by checking Django version, perhaps like this:

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())

Solution 2 - Python

Change this:

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

to this:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsupermarioView Question on Stackoverflow
Solution 1 - PythonAnton StrogonoffView Answer on Stackoverflow
Solution 2 - PythonCaptain SkyhawkView Answer on Stackoverflow