在Django 1.5中导入AUTH_USER_MODEL的更好方法

boa*_*der 5 python django

我正在努力使可插拔应用程序在Django 1.5下更具弹性,您现在可以使用自定义的可定义用户模型.

将外键添加到模型时,我可以这样做:

user = models.ForeignKey(settings.AUTH_USER_MODEL)
Run Code Online (Sandbox Code Playgroud)

这样可以节省我在django.contrib.auth.models.User不再是用户模型时中断的文件顶部的User导入.但有时在测试时,我需要能够创建一个用户,而我能够想到的最好用户就是

from django.conf import settings
from django.db.models import get_model
User = get_model(*settings.AUTH_USER_MODEL.split('.'))
Run Code Online (Sandbox Code Playgroud)

然后我可以这样做:

User.objects.create(username="test")
Run Code Online (Sandbox Code Playgroud)

在我的测试中(一些对象将FK绑定到用户,我在测试中需要其中一个对象).

它并没有让我觉得特别优雅,但我真的没有看到任何更干净的方式来做到这一点1.5.

我在文档中遗漏了什么吗?

kar*_*ikr 11

你可以做到的一种方法是:

try:
    from django.contrib.auth import get_user_model
except ImportError: # django < 1.5
    from django.contrib.auth.models import User
else:
    User = get_user_model()
Run Code Online (Sandbox Code Playgroud)


osa*_*osa 6

记住,get_user_model不能在模块级调用.特别是,甚至不要考虑使用它models.py来定义ForeignKey关系.AUTH_USER_MODEL如果需要,请使用此设置.

否则,正如我所发现的那样,在某些模型无法使用的情况下,您将会遇到奇怪且难以调试的错误.事实上,print get_user_model()在一个完全不同的django应用程序中,我只是添加到某个文件导致另一个导入失败的情况.

如果我阅读get_user_model的这篇介绍,我本可以节省几个小时......