django.contrib.auth.models.User.DoesNotExist:用户匹配查询不存在

时间:2019-03-24 09:59:47

标签: python django testing

当我尝试运行测试时,标题出现错误,我不知道发生了什么,但是我的testUser无法正常工作,这很有趣,因为我在另一个项目中拥有相同的测试用户,并且一切正常。

test_api.py

class TaskDetailViewAPI(APITestCase):
    def setUp(self):
       self.client = APIClient()
       self.user = User.objects.create_user(username='test', password='test123')
       self.user.save()

   @classmethod
   def setUpTestData(cls):
       user = User.objects.get(id=1)
       Task.objects.create(name='TestTask', user=user, status='NEW', date=date(2019, 4, 9), description='This is test')

    def test_access_to_view_logged(self):
       task= Task.objects.get(id=1)
       login = self.client.login(username='test', password='test123')
       self.assertTrue(login)

这是另一个项目的测试,一切正常

class CreateCommentAPI(APITestCase):
   def setUp(self):
       self.client = APIClient()
       self.user = User.objects.create_user(username='test', password='test123')
       self.user.save()

   @classmethod
   def setUpTestData(cls):
       Category.objects.create(name='PC', slug='pc')
       Product.objects.create(
           category=Category.objects.get(id=1),
           name='Laptop', slug='laptop',
           description='here is description',
           photo=SimpleUploadedFile("file.jpeg", b"file_content", content_type="image/jpeg"),
           price=1999, available='available'
        )

   def test_access_to_view_logged(self):
       product = Product.objects.get(id=1)
       login = self.client.login(username='test', password='test123')
       response = self.client.get(reverse('add_comments', kwargs={'id': product.id}))
       self.assertTrue(login)
       self.assertEqual(response.status_code, 200, f'expected Response code 200, instead get {response.status_code}')

3 个答案:

答案 0 :(得分:4)

setUpTestData在整个测试类中仅被调用一次,但更重要的是在之前 setUp被调用。

您的工作代码在setUpTestData中没有任何内容依赖于setUp中的数据,这是正确的。但是您的无效代码确实;它尝试访问尚未创建的用户。您需要进行重构,以便在setUpTestData内部创建用户,或者在setUp内部创建任务。

答案 1 :(得分:1)

您的测试用户的ID可能不是1,而不是使用ID,您可以在setUpTestData方法中使用用户名:

user = User.objects.get(username='test')

答案 2 :(得分:0)

TL; DR:就我而言,我忘记创建和应用迁移了

python manage.py makemigrations
python manage.py migrate

更长一点,我已经修改了Django模型,但是没有将更改推送/迁移到数据库中,该数据库实际上保存了有关那些模型的数据。因此,当我的代码要求提供模型数据时,它们不在数据库中,因此不在matching query does not exist中。

OP的问题不是这种情况,尽管我的答案可能是标题中提到的错误的一种解决方案,而错误却使我排在首位。