我正在使用Django 1.5,我正在尝试使用任何自定义用户模型的应用程序.我已经将应用程序更改为在任何地方使用get_user_model,并且应用程序本身到目前为止没有显示任何问题.
问题是我希望能够测试应用程序,但我找不到使用自定义用户模型使ForeignKey模型字段正确测试的方法.当我运行下面附带的测试用例时,我收到此错误:
ValueError: Cannot assign "<NewCustomUser: alice@bob.net>": "ModelWithForeign.user" must be a "User" instance.
这是我用来测试的文件:
from django.conf import settings from django.contrib.auth import get_user_model from django.contrib.auth.tests.custom_user import CustomUser,CustomUserManager from django.db import models from django.test import TestCase from django.test.utils import override_settings class NewCustomUser(CustomUser): objects = CustomUserManager() class Meta: app_label = 'myapp' class ModelWithForeign(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL) @override_settings( AUTH_USER_MODEL = 'myapp.NewCustomUser' ) class MyTest(TestCase): user_info = { 'email': 'alice@bob.net','date_of_birth': '2013-03-12','password': 'password1' } def test_failing(self): u = get_user_model()(**self.user_info) m = ModelWithForeign(user=u) m.save()
我正如here所述在ForeignKey参数列表中引用用户模型,但是使用get_user_model并没有改变任何内容,因为在设置更改发生之前评估了用户属性.当我使用自定义用户模型时,有没有办法让这个ForeignKey玩得很好?
解决方法
我也在Django邮件列表上询问过这个问题,但似乎至少目前还没有办法更改settings.AUTH_USER_MODEL,并且可以很好地使用ForeignKey.
到目前为止,为了测试我的应用程序,我从this answer创建了一个runtests.py文件:
import os,sys from django.conf import settings if len(sys.argv) >= 2: user_model = sys.argv[1] else: user_model = 'auth.User' settings.configure( ... AUTH_USER_MODEL=user_model,... ) ...
for i in "auth.User" "myapp.NewCustomUser"; do echo "Running with AUTH_USER_MODEL=$i" python runtests.py $i if [ $? -ne 0 ]; then break fi done
最后一点是使用函数来实际检索正确的用户模型信息,而不是仅仅使用“静态”变量:
def get_user_info(): if settings.AUTH_USER_MODEL == 'auth.User': return {default user info} if settings.AUTH_USER_MODEL == 'myapp.NewCustomUser': return {my custom user info} raise NotImplementedError
我并不认为这是对这个问题的正确答案,但到目前为止……它的确有效.