加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在Django 1.5中使用自定义用户模型作为ForeignKey进行测试

发布时间:2020-12-17 00:50:15 所属栏目:Python 来源:网络整理
导读:我正在使用Django 1.5,我正在尝试使用任何自定义用户模型的应用程序.我已经将应用程序更改为在任何地方使用get_user_model,并且应用程序本身到目前为止没有显示任何问题. 问题是我希望能够测试应用程序,但我找不到使用自定义用户模型使ForeignKey模型字段正
我正在使用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,...
)

...

并添加了一个bash脚本来实际使用不同的用户模型运行测试:

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

我并不认为这是对这个问题的正确答案,但到目前为止……它的确有效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读