2016-12-13 8 views
0

rest web jsonフォームからリクエストを送信し、custom_answersフィールドaは変換されたリストデータとともに存在しますが、ApiClientを使用してテストから同じデータを送信すると、custom_answers null list。環境に応じてシリアライズ後の結果が異なる


試験ENVから試験ENVから

{'custom_answers': [], 'poll': <Poll: Опрос 1>, 'user': <User: 123>} 

印刷シリアライザ初期化データをシリアライザメソッドを作成validated_data restfウェブJSON形式から

{'custom_answers': [OrderedDict([('user', <SimpleLazyObject: <User: 123>>), ('question', <Question: Вопрос 2>), ('text', 'TExt')]), OrderedDict([('user', <SimpleLazyObject: <User: 123>>), ('question', <Question: Вопрос 1>), ('text', 'tes')])], 'poll': <Poll: Опрос 1>, 'user': <SimpleLazyObject: <User: 123>>} 

印刷シリアライザメソッドを作成validated_dataプリント:

JSONデータとから、ウェブから10の
<QueryDict: {'poll': ['1'], 'custom_answers': ["{'question': 2, 'text': 'TExt'}", "{'question': 1, 'text': 'tes'}"]}> 

印刷シリアライザのinitデータ:私の英語のための

{custom_answers': [{'text': 'TExt', 'question': 2}, {'text': 'tes', 'question': 1}], 'poll': 1} 

申し訳ありません。

serializers.py

class CustomUserAnswerSerializer(serializers.ModelSerializer): 
    user = serializers.PrimaryKeyRelatedField(
     read_only=True, 
     default=CurrentUserDefault() 
    ) 

    class Meta: 
     model = CustomUserAnswer 
     fields = ('user', 'question', 'text') 


class CompletedPollSerializer(serializers.ModelSerializer): 
    user = serializers.PrimaryKeyRelatedField(
     read_only=True, 
     default=CurrentUserDefault() 
    ) 
    custom_answers = CustomUserAnswerSerializer(
     many=True, write_only=True, required=False  
    ) 

    class Meta: 
     model = CompletedPoll 
     fields = ('poll', 'user', 'custom_answers') 

    def create(self, validated_data): 
     print(validated_data) 

models.py ---

class CompletedPoll(models.Model): 
    user = models.ForeignKey(
     settings.AUTH_USER_MODEL, 
     related_name='ended_polls' 
    ) 
    poll = models.ForeignKey(Poll) 
    ended_date = models.DateTimeField(auto_now_add=True) 

    class Meta: 
     ordering = ('-ended_date',) 
     unique_together = ('user', 'poll') 


class CustomUserAnswer(models.Model): 
    user = models.ForeignKey(
     settings.AUTH_USER_MODEL, 
     related_name='custom_answers' 
    ) 
    question = models.ForeignKey(
     Question, 
     related_name='custom_answers' 
    ) 
    text = models.CharField(
     verbose_name='Текст ответа', 
     max_length=800 
    ) 

    class Meta: 
     unique_together = ('user', 'question') 

tests.py

class ApiPollsTestCase(APITestCase): 
    def setUp(self): 
     call_command('loaddata', 'polls/fixtures/polls') 

    self.user = User.objects.create(
     username='123', 
     password='123', 
     email='[email protected]' 
    ) 

    self.client = APIClient() 
    self.client.credentials(
     HTTP_AUTHORIZATION='Token ' + self.user.auth_token.key 
    ) 

    def test_complete_poll(self): 
     data = { 
      'poll': 1, 
      'custom_answers': [ 
       {'question': 2, 'text': 'TExt'}, 
       {'question': 1, 'text': 'tes'} 
      ] 
     } 

     response = self.client.post(reverse('api_v1:complete-poll'), data) 
     print(CustomUserAnswer.objects.all(), response.data) 
     self.assertEqual(response.status_code, 201) 
     self.assertTrue(
      CompletedPoll.objects.filter(
       user=self.user, poll__id=data['poll'] 
      ).exists() 
     ) 

答えて

0

を関連していないモデルの間であなたは、デフォルトでデータを送信しています入れ子にされたデータをサポートしないhtmlフォームであるコンテンツタイプ。ありがとう:(

response = self.client.post(reverse('api_v1:complete-poll'), data, format='json') 
+0

OMG、これは私を助けた:あなたが明示的にJSONデータを送っているに言及する必要が

waynee

関連する問題