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循环的主要内容,如果未能解决你的问题,请参考以下文章