Python 在Django中是否可以从第一个外键获取字段?
我正在尝试优化Django查询。现在,我正在抓取所有产品,然后遍历它们,并对“功能”图像url进行单独查询 有没有办法获取原始查询中feature=True的“Image”外键对象的url 当前代码:Python 在Django中是否可以从第一个外键获取字段?,python,django,Python,Django,我正在尝试优化Django查询。现在,我正在抓取所有产品,然后遍历它们,并对“功能”图像url进行单独查询 有没有办法获取原始查询中feature=True的“Image”外键对象的url 当前代码: products = Product.objects.values('id') products_list = [] for product in products: image_url = Image.objects.filter(product=product["id"]).
products = Product.objects.values('id')
products_list = []
for product in products:
image_url = Image.objects.filter(product=product["id"]).order_by('-feature').values("url").first().get("url", None)
image = resize_image(image_url, 500)
products_list.append({
"id": product["id"]
"image": image,
})
return Response({ "products": products_list }, status=status.HTTP_200_OK)
products = Product.objects.values('id', 'images__url')
products_list = []
for product in products:
image = resize_image(product["images__url"], 500)
products_list.append({
"id": product["id"]
"image": image,
})
return Response({ "products": products_list }, status=status.HTTP_200_OK)
我希望我能做什么:
products = Product.objects.values('id')
products_list = []
for product in products:
image_url = Image.objects.filter(product=product["id"]).order_by('-feature').values("url").first().get("url", None)
image = resize_image(image_url, 500)
products_list.append({
"id": product["id"]
"image": image,
})
return Response({ "products": products_list }, status=status.HTTP_200_OK)
products = Product.objects.values('id', 'images__url')
products_list = []
for product in products:
image = resize_image(product["images__url"], 500)
products_list.append({
"id": product["id"]
"image": image,
})
return Response({ "products": products_list }, status=status.HTTP_200_OK)
当我尝试这一点时,它似乎为每个图像返回一个产品,这根本不是我想要的
为了解决这个问题,我尝试在末尾添加一个.distinct('id'),但随后出现了以下错误:
NotImplementedError('annotate() + distinct(fields) is not implemented.')
在那之后,我不确定如何继续,或者这是否可能
型号(供参考):
非常感谢任何帮助
编辑:为上下文添加了更多代码在值查找中执行此查询很困难,因为您不会返回任何没有特色图像的产品 您可以使用
prefetch\u related
预填充反向关系查找的结果
products = Product.objects.prefetch_related('images')
for product in products:
print(product.images.all()) # This will not perform an additional query
可以使用对象筛选填充反向关系的查询集
我们可以使用distinct子句为每个产品只返回1个图像
products = Product.objects.prefetch_related(Prefetch(
'images',
queryset=Image.objects.filter(feature=True).order_by('product').distinct('product'),
to_attr='featured_image'
))
现在,在模板中,您可以循环使用此属性,只返回一个图像
{% for image in product.featured_image.all %}
{{ image.url }}
{% endfor %}
您正在使用哪个数据库?@IainShelvington postgresql是否要包括没有任何图像的产品?您将如何处理生成的产品?@IainShelvington从技术上讲,所有产品都应该有图像,但作为预防措施,我希望过滤掉那些没有图像的产品。@IainShelvington我将返回值到前端以供显示,但在返回之前还需要修改一些其他内容。例如,根据零售价格和价格计算利润字段。为了简化我的问题,我省略了其中一些。