在Django> = 1.5中引用User模型的最佳方法

时间:2013-09-24 22:01:43

标签: python django django-models

在Django> = 1.5?

中引用用户模型的最佳方法是什么?

阅读Referencing the User model后,我开始使用(1)一段时间了:

(1)

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

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

但是遵循Python的Zen,可读性很重要,为什么不这样:

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

4 个答案:

答案 0 :(得分:11)

更新:自Django 1.11起,get_user_model can now be called at import time, even in modules that define models.

这意味着你可以这样做: models.ForeignKey(get_user_model(), ...)


原始答案(Django< = 1.11)

如果您在模块级别使用get_user_model,则可能会experience circular reference出现问题。导入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,则auth.User将返回Django的默认用户模型AUTH_USER_MODEL

答案 1 :(得分:3)

只要您扩展用户模型(或根本不触摸它),您就可以:

from django.contrib.auth.models import User

author = models.ForeignKey(User)  

答案 2 :(得分:2)

我不认为“可读性计数”是关于第二种情况。

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

答案 3 :(得分:1)

在我看来,第二个。使用第二种方法,您可以将所有内容放在同一个文件中,而不需要修改2个不同的文件,以及可以找到的问题。