【问题标题】:Different result post serialization depending on the environment不同的结果后序列化取决于环境
【发布时间】:2016-12-13 08:33:57
【问题描述】:

我从 rest web json 表单和 custom_answers 字段发送请求,其中包含转换后的列表数据,但是当我使用 ApiClient 从测试中发送相同的数据时,custom_answers 为空列表。


从 restf web 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>>}

从测试环境中打印验证数据创建序列化方法

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

从测试环境打印序列化程序初始化数据:

<QueryDict: {'poll': ['1'], 'custom_answers': ["{'question': 2, 'text': 'TExt'}", "{'question': 1, 'text': 'tes'}"]}>

使用 json 数据从 Web 打印序列化程序初始化数据:

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

对不起我的英语。

序列化器.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='123@123.ru'
    )

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

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您正在发送具有默认内容类型的数据,即不支持嵌套数据的 html 表单。

    您需要明确提及您正在发送 json 数据:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      相关资源
      最近更新 更多