Django filter()。exists总是返回false

时间:2017-01-03 00:44:32

标签: python django

我已经开始在Django建立一个网站,而我正试图为它编写单元测试,但是,我无法让这个单元测试通过。

def test_email_already_in_use(self):
    user_email = 'testing_email@testing.com'
    password = 'testing_password'
    User.objects.create_user(username=user_email, password=password)
    tmp = User.objects.filter(email=user_email).exists()
    form_data = {'email': user_email, 'password': password}

    with self.assertRaises(ValidationError):
        form = UserForm(data=form_data)
        form.clean_email()

问题是tmp总是假的(tmp只是用来帮助我调试而不必再进一步。存在检查通常在clean_email中完成)。但是,当我运行代码的网站正常运行时,我尝试使用现有电子邮件创建新用户。我显然错过了create_user的工作方式。

当我尝试使用相同的电子邮件创建新用户时,这是正确检查已使用的电子邮件的代码。

def clean_email(self):
    email = self.data['email']

    if User.objects.filter(email=email).exists():
        raise ValidationError("Email already in use")
    if len(email) > 100:
        raise ValidationError("Email length exceeds 100")

    return email

1 个答案:

答案 0 :(得分:1)

如果您使用的是django.contrib.auth.models.User,则用户名和电子邮件字段会有所不同。以下代码行不会在电子邮件字段

中创建具有给定电子邮件地址的对象
 User.objects.create_user(username=user_email, password=password)

因此,您的存在查询应该是

  tmp = User.objects.filter(username=user_email).exists()