Django - 一行中的for循环

Posted

技术标签:

【中文标题】Django - 一行中的for循环【英文标题】:Django - for loop in one line 【发布时间】:2022-01-22 05:14:15 【问题描述】:

我正在将所有产品详细信息从 db 导出到 XML 文件。需要导出的字段之一是图像。有两个应该导出图像的字段。如果有一张图片(产品表)应该导出到item_image_link。如果有多个(ProductImage 表)到item_additional_image_link

products = Product.objects.filter(product_status=True).prefetch_related('images')

for product in products:
    item = ET.SubElement(channel, "item")
    g_item_id = ET.SubElement(item, ("http://base.google.com/ns/1.0id")).text = product.sku
    g_item_image_link = ET.SubElement(item, ("http://base.google.com/ns/1.0image_link")).text = 'http://127.0.0.1:8000'+products.image.url
    for image in product.images.all():
        g_item_additional_image_link = ET.SubElement(item, ("http://base.google.com/ns/1.0additional_image_link")).text = 'http://127.0.0.1:8000'+image.image.url

我已成功导出各个字段 item_additional_image_link 中每个产品的图像,但是根据 db 中的图像数量,它们显示在三个不同的行中。

<item>
  <g:id>55555</g:id>
  <g:additional_image_link>http://127.0.0.1:8000/media/photos/2021/12/20/K003-min.jpeg</g:additional_image_link>
  <g:additional_image_link>http://127.0.0.1:8000/media/photos/2021/12/20/K009-min.jpeg</g:additional_image_link>
  <g:additional_image_link>http://127.0.0.1:8000/media/photos/2021/12/20/image00024-min.jpeg</g:additional_image_link>
</item>

如何将上面的三行合二为一,每张图片之间用逗号分隔?比如:

<item>
  <g:id>55555</g:id>
  <g:additional_image_link>http://127.0.0.1:8000/media/photos/2021/12/20/K003-min.jpeg, http://127.0.0.1:8000/media/photos/2021/12/20/image00024-min.jpeg, http://127.0.0.1:8000/media/photos/2021/12/20/K009-min.jpeg</g:additional_image_link>
</item>

谢谢

【问题讨论】:

【参考方案1】:

在创建 ET.SubElement(...) 之前构建值

additional_image_links = ",".join([f"http://127.0.0.1:8000x.image.url" for x in product.images.all()])
if additional_image_links:
    g_item_additional_image_link = ET.SubElement(item, ("http://base.google.com/ns/1.0additional_image_link")).text = additional_image_links

【讨论】:

【参考方案2】:

您需要在多个文本字段上使用字符串方法.join 将它们合并为一个,然后生成单个 XML 元素。我猜是关于外星人的……

g_item_image_link = ET.SubElement(item, ("http://base.google.com/ns/1.0image_link")
    ).text = 'http://127.0.0.1:8000'+products.image.url

texts = []
for image in product.images.all():
    texts.append( 'http://127.0.0.1:8000'+image.image.url )

if texts: # don't generate an empty element
    g_item_additional_image_link = ET.SubElement(item, ("http://base.google.com/ns/1.0additional_image_link")
        ).text = ', '.join( texts)

【讨论】:

以上是关于Django - 一行中的for循环的主要内容,如果未能解决你的问题,请参考以下文章

For 循环在 Django、HTML 中无法按预期工作

Django模板中的for循环

Django模板中的数字for循环

Django dict键,for循环中的值不起作用

Django、模板、for 循环和循环

for循环中的Django模板多维数组访问