我正在尝试使用嵌套序列化器更新相关模型,但是在此过程中出现了奇怪的错误。
这些是我的模特:
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请求的测试非常有效。