[英]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.