簡體   English   中英

Django 模型字段在更新后保持相同的值

[英]Django Model Field Holds Same Value After Update

外鍵字段不會從 django 視圖更新。 當我運行我的測試用例時,所有 (ModelName)TestCase 都成功運行。 在視圖中使用相同的代碼時,(ModelNameView)TestCase 測試失敗。 我究竟做錯了什么 ?

我正在使用 django 3.1.1 和 djangorestframework 3.11.1

# models.py

class Request(models.Model):
   status = models.CharField(max_length=1, choices=(
     ('I', 'Initiating'), ('C', 'Connecting'), ('P', 'Peered')), default='I')

class Client(models.Model):
   name = models.CharField(max_length=100, blank=False, null=False)
   request = models.ForeignKey(Request, on_delete=models.CASCADE, related_name='clients')

class Server(models.Model):
   type = models.CharField(max_length=100, blank=False, null=False)
   client = models.OneToOneField(Client, on_delete=models.CASCADE)
# views.py

# view path ( app_name:path_name ) --> domain:server-peer-request
class ServerViewSet(viewsets.ViewSet):
   model = models.Server
   ....
   
   @action( detail=True, methods=['post',], url_name='peer-request', url_path='peer-request')
   def peer_server_to_clientrequest(self, request, pk):
       """This view updates a server instance underlying request status"""
       server = get_object_or_404(self.model, pk=pk)
       server.client.request.status = 'P'
       server.client.request.save()
       print(server.client.request.status )     # outputs **P**

       return Response(status=status.HTTP_200_OK)
# test_models.py

class ServerModelTestCase(TestCase):

   def setUp(self):
     # some model instances here e.g (self.client_one -- Client model), (self.request -- Request model)



   def test_relational_fields_can_update(self):
      server = models.Server.objects.create(type='microT2', client=self.client_one)
      self.assertEqual(server.client.request.status, 'I')    # 'I' is the default, so test passes

      server.client.request.status = 'P'
      server.client.request.save()                            
      self.assertEqual(server.client.request.status, 'P')      # This test pass

      # These other test are just to confirm the the instance is updated globally
      self.assertEqual(self.request.status, 'P')               # This test pass
      self.assertEqual(self.client.request.status, 'P')        # This test pass

class ServerViewTestCase(APITestCase):
   def setUp(self):
     # add some configurations and create instance of all models
  
   def test_peering_client_to_server_works_fine(self):
       url = reverse('domain:server-peer-request', kwargs={'pk': 1})
       res = self.client.post(url)

       print(self.request.status)                                 # Outputs I            
       self.assertTrue(status.is_success(res.status_code))        # This test passes
       self.assertEqual(self.server.client.request.status, 'P')   **# Fails  ::: AssertionError: 'I' != 'P'

這修復了它

我不得不在其值已更新的實例上調用refresh_from_db

下面的代碼

class ServerViewTestCase(APITestCase):
   def setUp(self):
     # add some configurations and create instance of all models
  
   def test_peering_client_to_server_works_fine(self):
       url = reverse('domain:server-peer-request', kwargs={'pk': 1})
       res = self.client.post(url)

       print(self.request.status)                                 
       self.assertTrue(status.is_success(res.status_code))        
       self.server.client.request.refresh_from_db()                 # NOTE THIs
       self.assertEqual(self.server.client.request.status, 'P')   

歸功於 django discord 組的用戶

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM