首页 > 解决方案 > Django REST框架嵌套序列化程序中的“此字段是必需的”

问题描述

我有 2 个序列化程序,

class AssetTypeChoiceSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(required=False)

    class Meta:
        model = AssetTypeChoice
        fields = ["id", "probe", "choice", "choice_name"]
        read_only_fields = ("probe",)

和一个父序列化器

class ProbeSerializer(serializers.ModelSerializer):
    asset_type_choices = AssetTypeChoiceSerializer(many=True)

    class Meta:
        model = Probe
        fields = [
            "id",
            "city",
            "street",
            "neighborhood",
            "rooms_from",
            "rooms_to",
            "price_from",
            "price_to",
            "asset_type_choices",
        ]

    def create(self, validated_data):
        asset_type_choices = validated_data.pop("asset_type_choices")
        probe = Probe.objects.create(**validated_data)
        for choice in asset_type_choices:
            AssetTypeChoice.objects.create(**choice, probe=probe)
        return probe

每次我发布以创建新探针时,我都会遇到错误

{ "asset_type_choices": [ "此字段为必填项。" ] }

当我删除 AssetTypeChoiceSerializer 并尝试发布时,我成功创建了一个新探针。

这是我发帖时的原始内容:

{
    "city": "test",
    "street": "",
    "neighborhood": "",
    "rooms_from": 0,
    "rooms_to": 0,
    "price_from": 0,
    "price_to": 0,
    "asset_type_choices": [
        {"id": 1, "choice": 1, "choice_name": "All"},
        {"id": 2, "choice": 1, "choice_name": "All"},
    ],
}

我究竟做错了什么?

标签: djangodjango-rest-framework

解决方案


所以问题是当我将我的使用从纯 django 更改为 django rest 框架时。我的观点是返回 request.data 而不是 serializer.data:

这是我之前的代码:

def probe_list(request):

if not request.user.is_authenticated:
    return Response({"Error": "User must be logged in"}, status=status.HTTP_401_UNAUTHORIZED)

if request.method == 'GET':
    qs = Probe.objects.all()
    serializer = ProbeSerializer(qs, many=True)
    return Response(request.data, status=status.HTTP_200_OK)

if request.method == 'POST':
    serializer = ProbeSerializer(data=request.data)

    if serializer.is_valid(raise_exception=True):
        serializer.save(user=request.user)
        return Response(request.data, status=status.HTTP_201_CREATED)

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

这是我的代码之后:

def probe_list(request):

if not request.user.is_authenticated:
    return Response({"Error": "User must be logged in"}, status=status.HTTP_401_UNAUTHORIZED)

if request.method == 'GET':
    qs = Probe.objects.all()
    serializer = ProbeSerializer(qs, many=True)
    return Response(serializer.data, status=status.HTTP_200_OK)

if request.method == 'POST':
    serializer = ProbeSerializer(data=request.data)

    if serializer.is_valid(raise_exception=True):
        serializer.save(user=request.user)
        return Response(serializer.data, status=status.HTTP_201_CREATED)

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

一个新手错误,但仍然是一个错误。


推荐阅读