Django Rest Framework嵌套的序列化程序错误的更新验证

时间:2018-07-19 16:24:59

标签: django django-rest-framework

我正在尝试使用嵌套序列化器更新相关模型,但是在此过程中出现了奇怪的错误。

这些是我的模特:

class Individual(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    first_name = models.CharField(max_length=100, blank=True)

class EntityMember(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    email = models.EmailField(max_length=255, blank=True)
    individual = models.ForeignKey('Individual')

和序列化器:

class IndividualSerializer(serializers.ModelSerializer):
    class Meta:
        model = Individual
        fields = ('id', 'first_name',)

class EntityMemberSerializer(serializers.ModelSerializer):
    individual = IndividualSerializer()

    class Meta:
        model = EntityMember
        fields = ('id', 'email', 'individual')

    def update(self, instance, validated_data):
        individual_data = validated_data.pop('individual', None)
        super().update(instance, validated_data)
        return instance

我正在运行测试:

def test_update_contact(self):
    data = {
        'email': 'misteryon@friends.com',
        'individual': {
            'first_name': 'Kenny'
        }
    }
    response = self.client.patch(self.url, data=data, format='json')
    print(response.data)
    self.assertEqual(response.status_code, status.HTTP_200_OK)
    self.assertEqual(response.data['email'], 'misteryon@friends.com')
    self.assertEqual(response.data['individual']['first_name'], 'Kenny')

urls.py:

url(r'^entities-members/(?P<pk>[0-9a-fA-F-]+)$', EntityMemberRetrieveUpdateView.as_view(), name='entity_member_retrieve_update'),

视图:

class EntityMemberRetrieveUpdateView(RetrieveUpdateAPIView):
    queryset = EntityMember.objects.all()
    serializer_class = EntityMemberSerializer
    permission_classes = (IsAdminOrAuthenticatedReadOnly,)

请求正在响应,并显示400 BAD REQUEST错误。 测试中的print显示: {'non_field_errors': [ErrorDetail(string="'OrderedDict([('first_name', 'Kenny')])' is not a valid UUID.", code='invalid')]}

如果我不发送individual数据,则请求会正常进行,并且EntityMember数据会成功更新(当然,Individual模型除外)。 在我看来,序列化程序期望该individual字段的UUID,但是根据文档http://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representations,我正在做的就很好。我想我丢失了一些东西,但看不到。

我正在使用 djangorestframework == 3.8.2

编辑:用于我正在使用的测试:

self.url = reverse('entity_member_retrieve_update', kwargs={'pk': entity_member.id})

entity_member是在setUp中创建的,并且在嵌套individual数据的情况下,对get请求的测试非常有效。

0 个答案:

没有答案