遵循Django-REST框架docs从测试客户端发布时,我无法获取dict嵌套字段。在
我的模型是:
class ClassificationOfDiseases(models.Model):
code = models.CharField(max_length=10)
description = models.CharField(max_length=300)
abbreviated_description = models.CharField(max_length=190)
parent = models.ForeignKey('self', null=True, related_name='children')
def __str__(self):
return self.abbreviated_description
class Group(models.Model):
experiment = models.ForeignKey(Experiment, related_name='groups')
title = models.CharField(max_length=50)
description = models.TextField()
inclusion_criteria = \
models.ManyToManyField(ClassificationOfDiseases, blank=True)
protocol_component = models.ForeignKey(
ProtocolComponent, null=True, blank=True
)
这些模型的序列化程序是:
^{pr2}$并且,测试将数据发布到API,如下所示:
def test_POSTing_new_group_adds_pre_existent_classification_of_diseases(self):
owner = User.objects.get(username='lab1')
experiment = Experiment.objects.get(nes_id=1, owner=owner)
self.client.login(username=owner.username, password='nep-lab1')
list_url = reverse('api_experiment_groups-list',
kwargs={'experiment_nes_id': experiment.nes_id})
response = self.client.post(
list_url,
{
'title': 'A title',
'description': 'A description',
# we post inclusion_criteria's that exists in
# ClassificationOfDiseases table (this table is
# pre-populated in db)
'inclusion_criteria': [
{'code': 'A00'}, {'code': 'A1782'}, {'code': 'A3681'},
{'code': 'A74'}
]
}
)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.client.logout()
new_group = Group.objects.last()
for inclusion_criteria in new_group.inclusion_criteria_set:
self.assertEqual(inclusion_criteria,
ClassificationOfDiseases.objects.get(
code=inclusion_criteria))
在GroupSerializer.create()
方法中带有#DEBUG
的两行在终端打印inclusion_criteria
和{
{'code': 'A74'} # print(inclusion_criteria)
<QueryDict: {'inclusion_criteria': ["{'code': 'A00'}", "{'code': 'A1782'}", "{'code': 'A3681'}", "{'code': 'A74'}"], 'title': ['A title'], 'description': ['A description']}> # print(self.initial_data)
如果所有的元素都是 我错过了什么?在
我找到了丢失的部分。这是在使用APITestCase类发布嵌套对象时选择正确的数据类型的问题。在
如果您在没有指定数据格式的情况下发布,
APITestCase.client.post
方法将发布一个QueryDict,这就是我在print(inclusion_criteria)
语句中得到的。在我们需要以
json
格式发布数据,因此我们将format=json
作为第三个参数传递给APITestCase.client.post
方法。在因此,我们使用:
^{pr2}$感谢这个stackoverflowpost。在
相关问题 更多 >
编程相关推荐