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