Django rest framework 嵌套写入序列化程序验证的\u日期为空

Django rest framework 嵌套写入序列化程序验证的\u日期为空,django-rest-framework,Django Rest Framework,按照最佳实践使用序列化程序创建嵌套对象,但是我仍然接收空的嵌套验证\u数据 序列化程序: class WriteOrganisationSiteSerializer(serializers.ModelSerializer): """Organisation Site serializer class for post methods.""" site = WriteAPSiteSerializer() class Meta: model = model

按照最佳实践使用序列化程序创建嵌套对象,但是我仍然接收空的嵌套验证\u数据

序列化程序:

class WriteOrganisationSiteSerializer(serializers.ModelSerializer):
    """Organisation Site serializer class for post methods."""

    site = WriteAPSiteSerializer()

    class Meta:
        model = models.OrganisationSite
        fields = ("organisation", "site")

    def create(self, validated_data):
        from fadat.sites.models import APSite

        site_data = validated_data.pop("site")
        activeplaces_site_id = site_data.pop("activeplaces_site_id")
        site, created = APSite.objects.get_or_create(
            activeplaces_site_id=activeplaces_site_id, defaults=site_data
        )
        organisation_site = models.OrganisationSite.objects.create(
            site=site, **validated_data
        )

        return organisation_site


class WriteAPSiteSerializer(serializers.Serializer):
    """Active Places Site serializer class for post methods."""

    class Meta:
        model = models.APSite
        fields = (
            "activeplaces_site_id",
            "site_name",
            "dependent_thoroughfare",
            "thoroughfare_name",
            "double_dependent_locality",
            "dependent_locality",
            "post_town",
            "postcode",
            "easting",
            "northing",
            "longitude",
            "latitude",
        )
景色

class OrganisationSitesView(APIView):
    """Organisation Sites API view."""

    def post(self, request, **kwargs):
        user = request.user

        ser = serializers.WriteOrganisationSiteSerializer(data=request.data)
        ser.is_valid(raise_exception=True)

        obj = ser.save()

        ser = serializers.ReadOrganisationSiteSerializer(obj)
        return Response(ser.data, status=201)
运行以下测试(或通过浏览器发送ajax请求,结果相同)

在我的视图中接收以下标题

{'organisation': 1, 'site': {'activeplaces_site_id': 1200341, 'site_name': 'CITY OF LONDON SCHOOL', 'dependent_thoroughfare': '', 'thoroughfare_name': 'QUEEN VICTORIA STREET', 'double_dependent_locality': '', 'dependent_locality': '', 'post_town': 'LONDON', 'postcode': 'EC4V 3AL', 'easting': 531990, 'northing': 180834, 'longitude': -0.099387, 'latitude': 51.511025}}
在视图中,
request.data
显示

{'Cookie': '', 'Content-Length': '368', 'Content-Type': 'application/json; charset=utf-8', 'Authorization': 'Token 0081d8a36d90f1d922a2a7df494afe127a220495'}
序列化后的数据仍然不会验证嵌套字段和返回

{'organisation': <Organisation: Club (Club)>, 'site': OrderedDict()}
{'organization':,'site':OrderedDict()}

好的,下面是我看到的需要修复的内容:设计
post()
方法的传统方法如下:

 def post(self, request, **kwargs):
    serializer = serializers.WriteOrganisationSiteSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    serializer.save()
    return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

虽然你的案例在很多方面都是等价的,但它显然不是100%正确的。也许这与您使用一个序列化程序创建新实例和另一个序列化程序显示结果有关(如果不需要的话):您可以设置哪些字段是只读的,哪些字段是只读的,哪些字段是只读的,以及哪些字段是读写的。我建议您遵循我上面列出的模式来指导您,并以书面形式定义OrganizationSiteSerializer如何向最终用户显示数据。如果您有任何问题,请务必告诉我。

好的,我看到需要解决的问题如下:设计
post()
方法的常规方法如下:

 def post(self, request, **kwargs):
    serializer = serializers.WriteOrganisationSiteSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    serializer.save()
    return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

虽然你的案例在很多方面都是等价的,但它显然不是100%正确的。也许这与您使用一个序列化程序创建新实例和另一个序列化程序显示结果有关(如果不需要的话):您可以设置哪些字段是只读的,哪些字段是只读的,哪些字段是只读的,以及哪些字段是读写的。我建议您遵循我上面列出的模式来指导您,并以书面形式定义OrganizationSiteSerializer如何向最终用户显示数据。如果您有任何问题,请告诉我。

您能分享您问题中ReadOrganizationSiteSerializer的外观吗?它是否缺少自定义的
to_representation()
?他@ohduran
类ReadOrganizationSiteSerializer(serializers.ModelSerializer):“获取方法的组织站点序列化器类。”“组织=组织序列化器()站点=APSiteSerializer()class Meta:model=models.organizationsite字段=(“id”、“organization”、“site”)
下面的答案是否令人满意@rob moorman?如果是,如果你接受它,它将意味着整个世界。你能分享一下你问题中ReadOrganizationSiteSerializer的样子吗?它是否缺少自定义的
to_representation()
?他@ohduran
类ReadOrganizationSiteSerializer(serializers.ModelSerializer):“获取方法的组织站点序列化器类。”“组织=组织序列化器()站点=APSiteSerializer()class Meta:model=models.organizationsite字段=(“id”、“organization”、“site”)
下面的答案是否令人满意@rob moorman?如果是的话,如果你接受它就意味着整个世界。谢谢你的回复。这似乎没有改变任何事情(这很明显,因为问题不是在读取保存的数据时发生的),因为验证数据时出现了问题:在
serializer.is_有效(raise_exception=True)
此站点的嵌套序列化数据是一个空的有序dict。似乎使用
ModelSerializer
作为嵌套serializer做了一些事情。如果我使用一个默认的序列化程序类(具有相同的字段,但随后被写出来)似乎接受验证。。。奇怪,谢谢你的回复。这似乎没有改变任何事情(这很明显,因为问题不是在读取保存的数据时发生的),因为验证数据时出现了问题:在
serializer.is_有效(raise_exception=True)
此站点的嵌套序列化数据是一个空的有序dict。似乎使用
ModelSerializer
作为嵌套serializer做了一些事情。如果我使用一个默认的序列化程序类(具有相同的字段,但随后被写出来)似乎接受验证。。。奇怪。