2017-10-06 61 views
0

繼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)) 

兩個#DEBUGGroupSerializer.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'}"]所有字典元素?

我失蹤了什麼?

回答

0

我有缺失的部分。使用API​​TestCase類發佈嵌套對象時,選擇正確的數據類型是個問題。

如果您在未指定數據格式的情況下發布,則發佈QueryDict的APITestCase.client.post方法,即我在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方法。

所以,我們使用:

response = self.client.post(
      list_url, 
      { 
       'title': 'A title', 
       'description': 'A description', 
       'inclusion_criteria': [ 
        {'code': 'A00'}, {'code': 'A1782'}, {'code': 'A3681'}, 
        {'code': 'A74'} 
       ] 
      }, format='json' 
     ) 

由於這個計算器post

相關問題