Django (DRF) - get_queryset - 尝试 return "images" 模型 "Product" 作为额外字段
Django (DRF) - get_queryset - Trying to return "images" with model "Product" as an extra field
我正在尝试创建一个 returns 所有产品的查询集。每个产品都有一个或多个产品图片,我想将它们添加为每个产品的额外字段“图像”。
所以我得到的回应是 [ { id: 1, name: "prod1", images: images } ]
我尝试了以下实现:
型号
class Product(models.Model):
name = models.CharField(max_length=255)
description = models.TextField()
price = models.FloatField()
class ProductImage(models.Model):
name = models.CharField(max_length=255)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
我的想法用最简单的方式实现了
class ProductViewSet(viewsets.ModelViewSet):
serializer_class = ProductSerializer
queryset = Product.objects.all()
def get_queryset(self):
queryset = Product.objects.all()
product_list = []
# iterate over all products
for product in queryset:
images = ProductImage.objects.filter(product=q.id)
product['images'] = images
product_list.append(product)
return product_list
给出错误
"TypeError: 'Product' object does not support item assignment"
新想法,创建一个新字典,添加产品元素,并添加“图片”作为额外字段。
class ProductViewSet(viewsets.ModelViewSet):
serializer_class = ProductSerializer
queryset = Product.objects.all()
def get_queryset(self):
queryset = Product.objects.all()
product_list = []
# iterate over all products
for q in queryset:
images = ProductImage.objects.filter(product=q.id)
product = {"id": q.id, "name": q.name, "description": q.description, "price": q.price, "images": images}
product_list.append(product)
return product_list
给出错误
Internal Server Error: /api/product/
Traceback (most recent call last):
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\viewsets.py", line 125, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
raise exc
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\mixins.py", line 46, in list
return Response(serializer.data)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\serializers.py", line 768, in data
ret = super().data
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\serializers.py", line 253, in data
self._data = self.to_representation(self.instance)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
return [
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\serializers.py", line 687, in <listcomp>
self.child.to_representation(item) for item in iterable
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\serializers.py", line 509, in to_representation
attribute = field.get_attribute(instance)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\relations.py", line 538, in get_attribute
relationship = get_attribute(instance, self.source_attrs)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\fields.py", line 95, in get_attribute
instance = instance[attr]
KeyError: 'categories'
我已经弄乱了一段时间,谁能给我指明正确的方向,告诉我怎么做?
向 class Product
添加另一个字段,这是一个名为 extra
的 JSONField
。然后,在 get_queryset() 方法中使用 product.extra = {'images': [image.image.url for image in images]}
。
我正在尝试创建一个 returns 所有产品的查询集。每个产品都有一个或多个产品图片,我想将它们添加为每个产品的额外字段“图像”。
所以我得到的回应是 [ { id: 1, name: "prod1", images: images } ]
我尝试了以下实现:
型号
class Product(models.Model):
name = models.CharField(max_length=255)
description = models.TextField()
price = models.FloatField()
class ProductImage(models.Model):
name = models.CharField(max_length=255)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
我的想法用最简单的方式实现了
class ProductViewSet(viewsets.ModelViewSet):
serializer_class = ProductSerializer
queryset = Product.objects.all()
def get_queryset(self):
queryset = Product.objects.all()
product_list = []
# iterate over all products
for product in queryset:
images = ProductImage.objects.filter(product=q.id)
product['images'] = images
product_list.append(product)
return product_list
给出错误
"TypeError: 'Product' object does not support item assignment"
新想法,创建一个新字典,添加产品元素,并添加“图片”作为额外字段。
class ProductViewSet(viewsets.ModelViewSet):
serializer_class = ProductSerializer
queryset = Product.objects.all()
def get_queryset(self):
queryset = Product.objects.all()
product_list = []
# iterate over all products
for q in queryset:
images = ProductImage.objects.filter(product=q.id)
product = {"id": q.id, "name": q.name, "description": q.description, "price": q.price, "images": images}
product_list.append(product)
return product_list
给出错误
Internal Server Error: /api/product/
Traceback (most recent call last):
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\viewsets.py", line 125, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
raise exc
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\mixins.py", line 46, in list
return Response(serializer.data)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\serializers.py", line 768, in data
ret = super().data
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\serializers.py", line 253, in data
self._data = self.to_representation(self.instance)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\serializers.py", line 686, in to_representation
return [
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\serializers.py", line 687, in <listcomp>
self.child.to_representation(item) for item in iterable
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\serializers.py", line 509, in to_representation
attribute = field.get_attribute(instance)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\relations.py", line 538, in get_attribute
relationship = get_attribute(instance, self.source_attrs)
File "C:\Users\Simon\.virtualenvs\django_backend-ZmgaAA1F\lib\site-packages\rest_framework\fields.py", line 95, in get_attribute
instance = instance[attr]
KeyError: 'categories'
我已经弄乱了一段时间,谁能给我指明正确的方向,告诉我怎么做?
向 class Product
添加另一个字段,这是一个名为 extra
的 JSONField
。然后,在 get_queryset() 方法中使用 product.extra = {'images': [image.image.url for image in images]}
。