Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中是否可以从第一个外键获取字段?_Python_Django - Fatal编程技术网

Python 在Django中是否可以从第一个外键获取字段?

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"]).

我正在尝试优化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"]).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我将返回值到前端以供显示,但在返回之前还需要修改一些其他内容。例如,根据零售价格和价格计算利润字段。为了简化我的问题,我省略了其中一些。