正如标题中的问题所提到的,我有2个模型,1个产品和1个产品图像。我试图让产品列表沿着与相关的产品图片,
class Product(models.Model):
title = models.CharField(max_length=200)
details = models.TextField(null = True)
slug = models.CharField(max_length=300, unique=True, null=True)
class ProductImages(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='product_imgs')
image = models.ImageField(upload_to='product_imgs/', null=True)
def __str__(self):
return self.image.url
我的观点为获取产品列表是,
def get_queryset(self):
qs = super().get_queryset()
if self.request.method == 'GET':
if 'category' in self.request.GET:
category = self.request.GET['category']
category = models.ProductCategory.objects.get(id=category)
qs = qs.filter(category=category)
if 'owner' in self.request.GET:
print('get_queryset Owner')
owner = self.request.GET['owner']
qs = qs.filter(owner=owner)
if 'available' in self.request.GET:
available = self.request.GET['available'] == 'true'
qs = qs.filter(available=available)
results = []
for product in qs:
images = models.ProductImages.objects.filter(product=product.id)
results.append({'product': product, 'images': images})
return JsonResponse({
'status': 'success',
'result': results,
})
我得到一个错误,说
TypeError:Product类型的对象不是JSON可序列化的
在线
return JsonResponse({
还尝试了以下两种可能的解决方案,
results = []
for product in qs:
images = models.ProductImages.objects.filter(product = product.id)
serialized_images = [{'url': img.image.url} for img in images]
results.append({'product': product.id, 'images': serialized_images})
serializer = serializers.ProductListSerializer(qs, many = True)
response = {'products': serializer.data, 'product_image': results}
和
results = []
for product in qs:
images = models.ProductImages.objects.filter(product = product.id)
serialized_product = {
'id': product.id,
'title': product.title,
'description': product.description,
...
}
serialized_images = [{'url': img.image.url} for img in images]
results.append({'product': serialized_product, 'images': serialized_images})
return results
但我得到以下错误,
Traceback (most recent call last):
File "/opt/homebrew/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/opt/homebrew/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/opt/homebrew/lib/python3.10/site-packages/django/views/decorators/csrf.py", line 56, in wrapper_view
return view_func(*args, **kwargs)
File "/opt/homebrew/lib/python3.10/site-packages/django/views/generic/base.py", line 104, in view
return self.dispatch(request, *args, **kwargs)
File "/opt/homebrew/lib/python3.10/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "/opt/homebrew/lib/python3.10/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/opt/homebrew/lib/python3.10/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/opt/homebrew/lib/python3.10/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "/opt/homebrew/lib/python3.10/site-packages/rest_framework/generics.py", line 239, in get
return self.list(request, *args, **kwargs)
File "/opt/homebrew/lib/python3.10/site-packages/rest_framework/mixins.py", line 40, in list
page = self.paginate_queryset(queryset)
File "/opt/homebrew/lib/python3.10/site-packages/rest_framework/generics.py", line 171, in paginate_queryset
return self.paginator.paginate_queryset(queryset, self.request, view=self)
File "/opt/homebrew/lib/python3.10/site-packages/rest_framework/pagination.py", line 204, in paginate_queryset
self.page = paginator.page(page_number)
File "/opt/homebrew/lib/python3.10/site-packages/django/core/paginator.py", line 77, in page
return self._get_page(self.object_list[bottom:top], number, self)
TypeError: unhashable type: 'slice'
我找不到返回响应的解决方案,这是2种不同模型的组合。有没有人可以帮我解决这个问题?
PS:我不想在前端获得产品列表,然后进行网络调用/调用,以获得与它们相关联的图像。
1条答案
按热度按时间pengsaosao1#
我假设问题来自以下几行:
然后:
这里要做的是将
ProductImages
示例列表序列化为JSON响应中products
键的值。但是
JsonResponse
不知道怎么做。你可以这样做: