在APIVi上显示对象

2024-04-19 04:59:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模型,我只想在我的/api/中显示模型的数据

from django.db import models
from rest_framework.authtoken.models import Token
from django.contrib.auth.models import User

class Book(models.Model):
    order_id = models.IntegerField()
    isbn = models.IntegerField()
    publisher = models.CharField(max_length=256)
    school = models.CharField(max_length=256)
    price = models.IntegerField()
    duration = models.CharField(max_length=10)
    order_datetime = models.DateTimeField(auto_now=False, auto_now_add=False)

    def __str__(self):
        return str(self.order_id)

这是我的网址.py地址:

from django.contrib import admin
from django.urls import path
from filter import views

urlpatterns = [
    path('', views.index, name='index'),
    path('api/', views.BookApiView.as_view(), name='book_api'),
    path('admin/', admin.site.urls),
]

这是我的视图.py地址:

from django.shortcuts import render
from rest_framework.views import APIView
from .models import Book
from django.http import JsonResponse


class BookApiView(APIView):
    def get(self, request, format=None):
        books = Book.objects.all()
        return JsonResponse({'model': list(books)})

我得到以下错误:'类型为'Book'的对象不可JSON序列化'

谨致问候

安东尼


Tags: pathdjangofromimportselfapiadminmodels
3条回答

您应该定义serializer来将模型实例数据转换为相应的JSON数据,因此定义serializer.py如下

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        fields = '__all__'
        model = Book


then in your view, change as below,<br>
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Book


class BookApiView(APIView):
    def get(self, request, format=None):
        booksqueryset = Book.objects.all()
        serializer = BookSerializer(booksqueryset, many=True)
        return Response(data=serializer.data)


阅读此DRF ModelSerializer Official Doc了解更多详细信息

伙计。。。在将数据发送到视图之前,您需要一个“序列化程序”! Serializez类从django ORM获取抽象数据,并将数据轻松解析为JSON。你知道吗

创建一个文件序列化程序.py同级视图.py 以及:

from rest_framework import serializers

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

创建SerializerBook类之后,在视图中导入它,并将BookQuerySet作为BookSerializer的第一个参数传递。你知道吗

...
class BookApiView(APIView):
    def get(self, request, format=None):
        books = Book.objects.all()
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)

Django模型不能隐式地序列化JSON。你知道吗

您需要一个序列化程序来将模型转换为可JSON序列化的表示(原始dict、列表、数字、字符串等)

Django rest框架序列化程序文档:http://www.django-rest-framework.org/api-guide/serializers/

class BookSerializer(serializers.Serializer):
    order_id = serializers.IntegerField()
    isbn = serializers.CharField()
    ...

class BookApiView(APIView):
    def get(self, request, format=None):
        books = Book.objects.all()

        serializer = BookSerializer(books, many=True)

        return JsonResponse({'model': serializer.data})

相关问题 更多 >