ProductImage类型的对象不可JSON序列化

2024-09-25 16:34:57 发布

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

我收到这个错误Object of type ProductImage is not JSON serializable 我正在尝试建立一个模型,在这个模型中,我可以使用ManytoManyFeild()添加多个图像。然后我想序列化它,以便将其发送到前端页面并在前端页面上显示

这是我的型号

from django.db import models


class Product(models.Model):
    id = models.IntegerField(unique=True,primary_key=True)
    title = models.CharField(max_length=200)
    description = models.TextField(max_length= 100000 ,null=True, blank=True)
    price = models.FloatField()
    count = models.IntegerField(default=1)
    file_content = models.ManyToManyField("ProductImage", related_name='file_content', blank=True, null=True)

    offer= models.BooleanField(default=False)

    def __str__(self):
        return self.title

class ProductImage(models.Model):
    property_id = models.ForeignKey(Product,on_delete=models.CASCADE ,null=True, blank=True)
    media = models.FileField(upload_to='pics')
    

    def __str__(self):
        return '%s-image' % (self.property_id.title)

    

这是我的序列化程序.py

from rest_framework import serializers
from . models import Product, ProductImage

class ProductImageSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = ProductImage
        fields = [ 'property_id','media']
       

class ProductSerializer(serializers.ModelSerializer):
    file_content = ProductImageSerializer(many=True)

  
    class Meta:
        model = Product
        fields = ['id', 'title','description', 'price','count', 'file_content',
                    'offer']
     
    extra_kwargs = {
        "file_content": {
            "required": False,
        }
    }

这是我的视图。py

from rest_framework.serializers import Serializer
from . models import Product, ProductImage
from rest_framework.response import Response
from . serializer import ProductSerializer

from rest_framework import status
from rest_framework.parsers import MultiPartParser, FormParser


from rest_framework.decorators import api_view, permission_classes, parser_classes
from rest_framework.permissions import IsAuthenticated


@api_view(['POST','GET'])
@permission_classes([IsAuthenticated])
@parser_classes([MultiPartParser, FormParser])
def ProductViews(request):
   
    if request.method == 'POST':
        files = request.FILES.getlist('file_content')
        if files:
            request.data.pop('file_content')

            serializer = ProductSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                tweet_qs = Product.objects.get(id=serializer.data['id'])
                uploaded_files = []
                for file in files:
                    content = ProductImage.objects.create(media=file)
                    uploaded_files.append(content)

                tweet_qs.file_content.add(*uploaded_files)
                context = serializer.data
                context["file_content"] = [file.id for file in uploaded_files]
                return Response(context, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            serializer = ProductSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                context = serializer.data
                return Response(context, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    elif request.method == 'GET':
        detail = [{"title": detail.title, "id": detail.id, "count": detail.count, "description": detail.description, "price": detail.price, "offer": detail.offer , "details": detail.file_content.all()}
        for detail in Product.objects.all()]
        return Response(detail)


我不知道怎么了,所以如果你能帮忙,我将非常感激。谢谢

注意:如果您知道制作Json的其他更好的方法,可以包含图像列表,您也可以共享它(或它的链接)


Tags: fromimportrestidtruedatareturnmodels
1条回答
网友
1楼 · 发布于 2024-09-25 16:34:57

这可能会帮助您:

类ProductImage(models.Model): 属性\u id=models.ForeignKey(产品,on\u delete=models.CASCADE,null=True,blank=True) media=models.FileField(上传到='pics')

def __str__(self):
    return '%s-image' % (self.property_id.title)

def media_url(self):
    return self.media.url

类ProductImageSerializer(serializers.ModelSerializer):

class Meta:
    model = ProductImage
    fields = [ 'property_id','media','media_url']

相关问题 更多 >