无法在 Django-rest 中使用 Many=true 字段验证表单

问题描述 投票:0回答:1

我正在尝试使用 Django-rest 作为 astro 前端的 api,我认为我在发表文章时发现了一个问题:

{'items': [ErrorDetail(string='This field is required.', code='required')]}

我的代码是下一个:

views.py

from django.shortcuts import render

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Ticket, Item
from .serializers import TicketSerializer, ItemSerializer
import json
# Create your views here.

class TicketView(APIView):
    def post(self, request, format=None):

        items = request.data.pop('items')[0]
        # Items are given as a string with the json format. We need to parse it.
        items = json.loads(items)[0]
        # Add the items to the request data
        data = request.data
        data['items'] = items
        
        data.pop('itemName0')
        data.pop('itemPrice0')
        data.pop('itemCount0')
        print(data)
        serializer = TicketSerializer(data=data)
        
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        print(serializer.errors)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

序列化器

from .models import Ticket, Item
from rest_framework import serializers

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('name', 'price', 'count')
class TicketSerializer(serializers.ModelSerializer):
    items = ItemSerializer(many=True)

    class Meta:
        model = Ticket
        fields = ('img', 'subtotal', 'service', 'tax', 'etc', 'total', 'items')

    def create(self, validated_data):
        items_data = validated_data.pop('items')
        ticket = Ticket.objects.create(**validated_data)
        for item_data in items_data:
            Item.objects.create(ticket=ticket, **item_data)
        return ticket


在视图中修改后打印 request.data 的输出:

<QueryDict: {'subtotal': ['12'], 'service': ['12'], 'tax': ['12'], 'etc': ['12'], 'total': ['120'], 'img': [<InMemoryUploadedFile: photo_2024-01-17 23.39.53.jpeg (image/jpeg)>, <InMemoryUploadedFile: photo_2024-01-17 23.39.53.jpeg (image/jpeg)>], 'items': [{'name': 'mei', 'count': '012', 'price': '012'}]}>

可能会发生什么?因为 items 位于 querydict 中,而且我认为格式正确。如果不是,我怎么知道每种类型字段的正确格式是什么?包括many=true字段。

我尝试过按照收到的项目进行处理、更改它甚至更改 is_valid,但我没有足够的知识来创建我自己的 is_valid 版本。

python django django-rest-framework django-views django-serializer
1个回答
0
投票

在这里您可能没有正确传递项目数据 这是 item 数据传递的示例。

因为您正在创建多个项目items = ItemSerializer(many=True)

您必须按照下面的格式在项目中传递数据

{
...

"items":[
         {"name":"a","price":100,"count":15}, 
         {"name":"a","price":100,"count":15},
         {"name":"a","price":100,"count":15}
        ]
}
© www.soinside.com 2019 - 2024. All rights reserved.