如何从Django Rest Framework serializ的manytomy字段获取列表元素

2024-06-16 11:37:28 发布

您现在位置:Python中文网/ 问答频道 /正文

遵循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)

如果所有的元素都是

我错过了什么?在


Tags: selftrueobjectstitlemodelscodedescriptionlength
1条回答
网友
1楼 · 发布于 2024-06-16 11:37:28

我找到了丢失的部分。这是在使用APITestCase类发布嵌套对象时选择正确的数据类型的问题。在

如果您在没有指定数据格式的情况下发布,APITestCase.client.post方法将发布一个QueryDict,这就是我在print(inclusion_criteria)语句中得到的。在

<QueryDict: {'inclusion_criteria': ["{'code': 'A00'}", "{'code': 'A1782'}", "{'code': 'A3681'}", "{'code': 'A74'}"], 'title': ['A title'], 'description': ['A description']}>

我们需要以json格式发布数据,因此我们将format=json作为第三个参数传递给APITestCase.client.post方法。在

因此,我们使用:

^{pr2}$

感谢这个stackoverflowpost。在

相关问题 更多 >