Подтвердить что ты не робот

Лучший способ ссылки на модель пользователя в Django >= 1.5

Каков наилучший способ ссылки на модель пользователя в Django >= 1.5?

После прочтения Ссылка на модель пользователя, я начал использовать (1) на некоторое время:

(1)

from django.conf import settings
from django.db import models

class Article(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL)

Но после Zen of Python, читаемость подсчитывается, почему бы и нет:

(2)

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

User = get_user_model()

class Article(models.Model):
    author = models.ForeignKey(User)
4b9b3361

Ответ 1

UPDATE: Начиная с Django 1.11, get_user_model теперь можно вызывать во время импорта, даже в модулях, определяющих модели.

Это означает, что вы можете сделать это: models.ForeignKey(get_user_model(), ...)


Оригинальный ответ (Django <= 1.11)

Вы можете узнать круговую ссылку, если используете get_user_model на уровне модуля. Другой вариант импорта пользовательской модели auth:

from django.conf import settings

AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')

# models
class Article(models.Model):
    author = models.ForeignKey(AUTH_USER_MODEL)

getattr вернет пользовательскую модель по умолчанию Django, которая auth.User, если AUTH_USER_MODEL не обнаружена в файле настроек.

Ответ 2

Пока вы просто расширяете модель пользователя (или вообще не трогаете его), выполните следующие действия:

from django.contrib.auth.models import User

author = models.ForeignKey(User)  

Ответ 3

По-моему второй. Во-вторых, вы можете иметь все в одном файле, и вам не нужно изменять 2 разных файла, с возможными проблемами, которые вы можете найти с этим.

Ответ 4

Я не думаю, что "Чтение счетчиков" - это второй случай.

author = models.ForeignKey(User)

выглядит как

from django.contrib.auth.models import User

... # Imagine tons of code here    

class Article(models.Model):
    author = models.ForeignKey(User)

для меня. Будет удивлен, когда не сработает

article.author.get_full_name() # or any auth.models.User specific method