我正在尝试使用 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 版本。
在这里您可能没有正确传递项目数据 这是 item 数据传递的示例。
因为您正在创建多个项目items = ItemSerializer(many=True)
您必须按照下面的格式在项目中传递数据
{
...
"items":[
{"name":"a","price":100,"count":15},
{"name":"a","price":100,"count":15},
{"name":"a","price":100,"count":15}
]
}