Вернуть ответ со списком сериализаторов Django REST Framework

Я кодирую некоторое серверное программное обеспечение для подержанного приложения для продажи, используя Django и DjangoRestFramework. Прямо сейчас я пытаюсь отправить объект Response, содержащий список продуктов, но, похоже, я не могу вернуть фактический список продуктов, так как получаю сообщение об ошибке

ListSerializer is not JSON serializable.

Я пробовал использовать конструктор сериализатора следующим образом:

ProductoSerializer(products, many=True)

И создав список ProductoSerializer.data, а затем создав с ним объект Response.

Вот сериализаторы, которые я использую:

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')

А вот функция views.py, которую я пытаюсь закодировать:

@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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
0
2 581
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, когда вы используете 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

Его следует изменить для всех SerializerMethodField методов.

Другие вопросы по теме