我正在使用原始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']
QuerySet对象的情况下有效。使用连接对象执行查询将产生Python本机数据类型(如ListSerializer无法使用的结果),如List和Tuple。因此,在这种情况下,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.pyfrom 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"
}
]
}