如何将QuerySet实例传递给序列化程序?

问题描述 投票:0回答:1

我正在使用原始sql(使用orm正在工作)来获取产品,并且出现此错误

Got AttributeError when attempting to get a value for field `name` on serializer `ProductSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `tuple` 
instance.
Original exception text was: 'tuple' object has no attribute 'name'.

这是get函数:

def get(self, request, store_id, format=None):
    with connection.cursor() as cursor:
        user = request.user
        check_auth = get_object_or_404(
            Store, id=store_id, owner_id=user.id)
        if check_auth != None:
            connection.cursor()
            cursor.execute('SELECT * FROM products')
            products = cursor.fetchall()
            serializer = ProductSerializer(products, many=True)
            return Response(serializer.data)
    raise Http404

这是序列化器类:

class ProductSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only=True)
category = CategorySerializer()

class Meta:
    model = Product
    fields = ['id', 'store_id', 'name', 'summary',
              'description', 'category', 'main_image', 'price', 'offer_price', 'cost', 
    'available_quantity']
django django-rest-framework django-serializer
1个回答
0
投票
ModelSerializer仅在从模型中检索到

QuerySet对象的情况下有效。使用连接对象执行查询将产生Python本机数据类型(如ListSerializer无法使用的结果),如ListTuple。因此,在这种情况下,cursor.fetchall()将给出tuples的列表,并且每个元组都包含一个关系DB行。因此,要序列化这些数据类型而不是ModelSerializer,请仅使用Serializer。下面的代码片段将提供有关[[SerializerMethodField。]]的详细信息。View.py

class RawQueryDjango(APIView): def get(self, request): from django.db import connection cursor = connection.cursor() cursor.execute('select * from products_usermodel') res = cursor.fetchall() serializer = RawQuerySerializer(res, many=True) print(serializer.data) return Response({'detail': serializer.data}) Serializer.py

from rest_framework.serializers import Serializer, ModelSerializer, SerializerMethodField class RawQuerySerializer(Serializer): name = SerializerMethodField() last_name = SerializerMethodField() def get_name(self, obj): return obj[1] def get_last_name(self, obj): return obj[2]

这将给出以下响应。

{ "detail": [ { "name": "abc", "last_name": "sadfasd" }, { "name": "asasasd", "last_name": "werwe" }, { "name": "asdafa", "last_name": "1231weasd" }, { "name": "sh", "last_name": "patil" } ] }

© www.soinside.com 2019 - 2024. All rights reserved.