Django 模型实例仅在再次调用 objects.get() 后更新(DRF 测试用例)

Djnago model instance only update after calling objects.get() again (DRF Test case)

我有一个 APIView (DRF),我将用户 is_active 字段设置为 False 而不是删除他,一切都按预期工作,但我有一个当我尝试为视图制作测试用例时的有线行为,我尝试在调用 ApiView 后测试字段 'is_active' 是否为 False 但如果稍微更改代码并调用 'True' =28=]() 在调用 ApiView 后使用相同的用户电子邮件,新实例字段 is_active 为 False。

我从来没有遇到过这种行为,谁能解释一下背后的原因?谢谢!

此测试通过:

def test_delete_account(self):
        self.authentication() # create user and log him in
        user = User.objects.get(email=self.sample_user['email'])
        self.assertEqual(user.is_active, True)
        response = self.client.post(reverse('delete-account'))
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        user = User.objects.get(email=self.sample_user['email']) 
        self.assertEqual(user.is_active,False)

此测试失败:

def test_delete_account(self):
        self.authentication() # create user and log him in
        user = User.objects.get(email=self.sample_user['email'])
        self.assertEqual(user.is_active, True)
        response = self.client.post(reverse('delete-account'))
        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        self.assertEqual(user.is_active,False) # FAILS HERE

删除帐户 ApiView:

class DeleteAccountAPIView(GenericAPIView):

    permission_classes = (permissions.IsAuthenticated,)

    def post(self, request):
        user = self.request.user
        user.is_active = False
        user.save()
        return  Response(status=status.HTTP_204_NO_CONTENT)

在您的测试中,您正在调用 'remote' 请求,更改在 'remote':


     client ---- (call via post) --> remote 
   (the test)                   (django web app)
       |                               |
       ---------------------------------
                     |
                 database

事情是这样的:

# you get a user from database
user = User.objects.get(email=self.sample_user['email'])

# you make a post to 'remote' server
response = self.client.post(reverse('delete-account'))

# no changes should be in 'client' side
self.assertEqual(user.is_active,True)

# when you refresh data from database
user = User.objects.get(email=self.sample_user['email']) 

# you get the current database data that contains changes from remote
self.assertEqual(user.is_active,False)