首页 > 解决方案 > 嵌套创建序列化程序中的 Django Rest Framework 错误

问题描述

我正在尝试使用嵌套的序列化程序将信息插入到数据库中,但我有错误

虚拟模型

class Supplier(models.Model):
    name = models.CharField(max_length=250)


class SupplierContacts(models.Model):
    supplier = models.ForeignKey(
        'Supplier',
        related_name='contacts',
        on_delete=models.CASCADE
    )
    last_name = models.CharField(max_length=50)


class SupplierUsers(models.Model):
    supplier = models.ForeignKey(
        'Supplier',
        related_name='users',
        on_delete=models.CASCADE
    )
    last_name = models.CharField(max_length=50)
  

虚拟序列化器


class SupplierSerializer(serializers.ModelSerializer):
    users = SupplierUserSerializer() 
    contacts = SupplierContactsSerializer(many=True)

    class Meta:
        model = Supplier
        fields = [
            'name',
            'users',
            'contacts'
        ]

    def create(self, validated_data):
        users_data = validated_data.pop('users')
        contacts_data = validated_data.pop('contacts')

        supplier = Supplier.objects.create(**validated_data)
        SupplierUsers.objects.create(supplier=supplier, **users_data)

        for contact in contacts_data:
            SupplierContacts.objects.create(supplier=supplier, **contact)

        return supplier

在视图中自定义创建这样

class ViewSet(mixins.CreateModelMixin,
              viewsets.GenericViewSet):

    queryset = Supplier.objects.all()
    serializer_class = SupplierSerializer

    def create(self, request, *args, **kwargs):
        # import ipdb
        # ipdb.set_trace()
        serializer = SupplierSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()  # here works saved to db
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我正在按照文档中的说明进行操作,但出现以下错误。

AttributeError: Got AttributeError when attempting to get a value for field `last_name` on serializer `SupplierUserSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `RelatedManager` instance.
Original exception text was: 'RelatedManager' object has no attribute 'last_name'.

数据已保存,问题在于反序列化 =>serializer.data

有任何想法吗?

标签: pythonpython-3.xdjangodjango-rest-framework

解决方案


推荐阅读