简体   繁体   English

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

[英]Django Model Field Holds Same Value After Update

Foreign Key field doesn't update from django view.外键字段不会从 django 视图更新。 When i run my test cases, all (ModelName)TestCase runs successfully.当我运行我的测试用例时,所有 (ModelName)TestCase 都成功运行。 When same code is utilized in view, (ModelNameView)TestCase tests Fail.在视图中使用相同的代码时,(ModelNameView)TestCase 测试失败。 What am I doing wrong ?我究竟做错了什么 ?

I'm using django 3.1.1 and djangorestframework 3.11.1我正在使用 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'

This fixes it这修复了它

i had to call refresh_from_db on the instance whose value was updated我不得不在其值已更新的实例上调用refresh_from_db

code below下面的代码

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')   

Credit goes to a user from django discord group归功于 django discord 组的用户

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM