社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

返回带有序列化程序Django REST Framework列表的响应

Enrique Torres • 5 年前 • 1511 次点击  

我正在使用Django和DjangoRestFramework为二手销售应用程序编写一些后端软件。现在,我正试着发送一个 Response 对象,该对象包含产品列表,但我似乎无法返回实际的产品列表,因为我在说

ListSerializer is not JSON serializable.

我尝试过使用序列化程序构造函数,如下所示:

ProductoSerializer(products, many=True)

ProductoSerializer.data 然后创建 反对这个。

下面是我正在使用的序列化程序:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    ciudad = serializers.SerializerMethodField()
    conectado = serializers.SerializerMethodField()
    class Meta:
        model = Usuario
        fields = ('uid', 'nombre', 'ciudad', 'conectado')
    def get_ciudad(self, obj):
        geolocator = Nominatim(user_agent="bookalo")
        location = geolocator.reverse(str(obj.latitud_registro) + ',' + str(obj.longitud_registro))
        return location.raw['address']['city']

    def get_conectado(self, obj):
        ahora = timezone.now()
        result = relativedelta(ahora, obj.ultima_conexion)
        return result.days == 0 and result.hours == 0 and result.months == 0 and result.years == 0 and result.minutes < 5

class TagSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Tag
        fields = ('nombre')

class MultimediaSerializer(serializers.HyperlinkedModelSerializer):
    contenido_url = serializers.SerializerMethodField()
    class Meta:
        model = ContenidoMultimedia
        fields = ('contenido_url', 'orden_en_producto')

    def get_contenido_url(self, obj):
        return obj.contenido.url

class MiniProductoSerializer(serializers.HyperlinkedModelSerializer):
    contenido_multimedia = serializers.SerializerMethodField()
    class Meta:
        model = Producto
        fields = ('nombre', 'precio', 'estado_venta', 'contenido_multimedia')

    def get_contenido_multimedia(self, obj):
        contenido = ContenidoMultimedia.objects.get(producto=obj.pk, orden_en_producto=0)
        return MultimediaSerializer(contenido)

class ProductoSerializer(serializers.HyperlinkedModelSerializer):
    vendido_por = UserSerializer(read_only=True)
    tiene_tags = TagSerializer(many=True, read_only=True)
    contenido_multimedia = serializers.SerializerMethodField()
    valoracion_media_usuario = serializers.SerializerMethodField()
    class Meta:
        model = Producto
        fields = ('nombre', 'precio', 'estado_producto', 'estado_venta', 'latitud', 'longitud', 'tipo_envio', 'descripcion', 'vendido_por', 'tiene_tags', 'num_likes', 'contenido_multimedia')

    def get_contenido_multimedia(self, obj):
        contenido = ContenidoMultimedia.objects.filter(producto=obj.pk).order_by('orden_en_producto')
        return MultimediaSerializer(contenido, many=True)

    def get_valoracion_media_usuario(self, obj):
        return Usuario.objects.get(pk=obj.vendido_por).media_valoraciones

class ValidacionEstrellaSerializer(serializers.HyperlinkedModelSerializer):
    usuario_que_valora = UserSerializer(read_only=True)
    producto_asociado = serializers.SerializerMethodField()
    class Meta:
        model = ValidacionEstrella
        fields = ('estrellas', 'comentario', 'timestamp', 'usuario_que_valora', 'producto_asociado')

    def get_producto_asociado(self, obj):
        producto = Producto.objects.get(pk=obj.producto)
        return MiniProductoSerializer(producto)

class UserProfileSerializer(serializers.HyperlinkedModelSerializer):
    usuario_valorado_estrella = serializers.SerializerMethodField()
    productos_favoritos = serializers.SerializerMethodField()
    class Meta:
        model = Usuario
        fields = ('uid', 'nombre', 'esta_baneado', 'usuario_valorado_estrella', 'producto_del_usuario')

    def get_usuario_valorado_estrella(self, obj):
        validaciones = ValidacionEstrella.objects.filter(usuario_valorado=obj.pk).order_by('-timestamp')
        return ValidacionEstrellaSerializer(validaciones, many=True, read_only=True)

    def get_productos_favoritos(self, obj):
        favoritos = Producto.objects.filter(le_gusta_a__in=[obj.pk])
        return ProductoSerializer(favoritos, many=True, read_only=True)

class ReportSerializer(serializers.HyperlinkedModelSerializer):
    #usuario_reportado = serializers.SerializerMethodField()
    usuario_reportado = UserSerializer(read_only=True)
    class Meta:
        model = Report
        fields = ('usuario_reportado', 'causa')

@api_view(['POST'])
@permission_classes((permissions.AllowAny,))
def SearchProduct(request, format=None):
    if request.method != 'POST':
        return Response(status=status.HTTP_400_BAD_REQUEST)
    preposiciones = ['a','ante','bajo','cabe','con','contra','de','desde','en','entre',
    'hacia','hasta','para','por','segun','sin','so','sobre','tras']
    try:
        search = request.POST.get('busqueda')
    except:
        return Response(status=status.HTTP_404_NOT_FOUND)
    products = Producto.objects.none()
    for word in search.split():
        if word not in preposiciones:
            productos_palabra = Producto.objects.filter(nombre__contains=word)
            products = products | productos_palabra
    products.distinct()
    product_list = []
    for prod in products:
        product_list.append(ProductoSerializer(prod).data)
    return Response({'productos': product_list}, status=status.HTTP_200_OK)

我正在使用一个请求对象,因为我还必须为一个网页提供服务器,而不仅仅是一个具有相同功能的移动应用程序(网页部分仍然没有编码)。

ProductoSerializer 对象,但由于某种原因,它正在输出该错误,我不太确定如何修复它。

提前谢谢,如果你需要我错过的任何额外信息,请一定要它。。。这是漫长的一天,我可能错过了什么。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/54368
文章 [ 1 ]  |  最新文章 5 年前
Sergey Pugach
Reply   •   1 楼
Sergey Pugach    6 年前

当你使用 SerializerMethodField 返回序列化程序实例,但不是 data

例如:

contenido_multimedia = serializers.SerializerMethodField()


def get_contenido_multimedia(self, obj):
        contenido = ContenidoMultimedia.objects.filter(producto=obj.pk).order_by('orden_en_producto')
        return MultimediaSerializer(contenido, many=True).data  # <-- here try to add .data

一切都应该改变 序列化方法字段 方法。