繼Django REST框架docs從測試客戶端發佈時,我無法獲取dict嵌套字段。如何從Django Rest框架序列化程序中的manytomany字段中獲取列表元素
我的車型有:
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
)
該模型的串行器:
class ClassificationOfDiseasesSerializer(serializers.Serializer):
class Meta:
model = ClassificationOfDiseases
fields = ('code',)
class GroupSerializer(serializers.ModelSerializer):
experiment = serializers.ReadOnlyField(source='experiment.title')
inclusion_criteria = ClassificationOfDiseasesSerializer(many=True,
read_only=False)
class Meta:
model = Group
fields = ('id', 'title', 'description', 'experiment',
'inclusion_criteria')
def create(self, validated_data):
group = Group.objects.create(experiment=validated_data['experiment'],
title=validated_data['title'],
description=validated_data['description'])
if 'inclusion_criteria' in self.initial_data:
inclusion_criteria = self.initial_data['inclusion_criteria']
print(inclusion_criteria) # DEBUG
print(self.initial_data) # DEBUG
for criteria in inclusion_criteria:
classification_of_diseases = \
ClassificationOfDiseases.objects.filter(
code=criteria['code']
)
if classification_of_diseases:
group.inclusion_criteria.add(
classification_of_diseases.first()
)
return group
而且,測試數據發佈的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))
兩個#DEBUG
GroupSerializer.create()
方法打印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)
那麼,爲什麼self.initial_data['inclusion_criteria']
越來越只剩下最後期限({'code': 'AY4'}
),而不是所有的人,如果self.initial_data
的QueryDict有'inclusion_criteria': ["{'code': 'A00'}", "{'code': 'A1782'}", "{'code': 'A3681'}", "{'code': 'A74'}"]
所有字典元素?
我失蹤了什麼?