Django - XML 文件中的产品详细信息
Django - Product Details in XML file
我的任务是将所有产品详细信息(例如名称、价格等)从数据库导出到 XML 文件。从现在开始,我正在导出大部分字段并将它们保存到 XML 文件中。但是我对如何导出图像有点困惑。
我有 2 个模型,一个用于 Product,一个用于 ProductImages,见下文:
models.py
class Product(models.Model):
category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)
name = models.CharField(max_length=50)
slug = models.SlugField(max_length=500, null=True, unique=True)
sku = models.CharField(max_length=100, unique=True)
image = models.ImageField(upload_to='photos/%Y/%m/%d/')
created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now=True)
class ProductImage(models.Model):
product = models.ForeignKey(Product, related_name='images', on_delete=models.CASCADE)
title = models.CharField(max_length=50, blank=True)
image = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, null=True)
此外,根据要求,有两个字段应导出图像。如果有一张图片(产品 table)应该导出到 item_image_link
,我可以毫无问题地导出它。如果 item_additional_image_link
有多个 (ProductImage table),这就是我遇到的问题。
我像下面一样遍历产品 table,然后尝试查找特定产品 ID 的所有图片,例如:
products = Product.objects.filter(product_status=True)
images = ProductImage.objects.filter(product__id__in=products)
for products in products:
item = ET.SubElement(channel, "item")
g_item_id = ET.SubElement(item, ("{http://base.google.com/ns/1.0}id")).text = products.sku
g_item_image_link = ET.SubElement(item, ("{http://base.google.com/ns/1.0}image_link")).text = 'http://127.0.0.1:8000'+products.image.url
for image in images:
g_item_additional_image_link = ET.SubElement(item, ("{http://base.google.com/ns/1.0}additional_image_link")).text = 'http://127.0.0.1:8000'+image.image.url
但是 g_item_additional_image_link 带来了我在数据库中拥有的所有产品的所有图像。我想问题出在 images query
。我如何显示与每个产品相关的图片?
谢谢
您不需要为图像定义额外的查询,因为 Django 会为您链接它们。
首先,将 prefetch_related 添加到产品查询中。这样 django 就不会在遍历图像时创建第二个查询:
products = Product.objects.filter(product_status=True).prefetch_related('images')
然后,遍历相关图像:
for image in product.images.all():
...
在遍历它们时,您还应该使用 product
而不是 products
。
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.0}id")).text = product.sku
g_item_image_link = ET.SubElement(item, ("{http://base.google.com/ns/1.0}image_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.0}additional_image_link")).text = 'http://127.0.0.1:8000'+image.image.url
我的任务是将所有产品详细信息(例如名称、价格等)从数据库导出到 XML 文件。从现在开始,我正在导出大部分字段并将它们保存到 XML 文件中。但是我对如何导出图像有点困惑。 我有 2 个模型,一个用于 Product,一个用于 ProductImages,见下文:
models.py
class Product(models.Model):
category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)
name = models.CharField(max_length=50)
slug = models.SlugField(max_length=500, null=True, unique=True)
sku = models.CharField(max_length=100, unique=True)
image = models.ImageField(upload_to='photos/%Y/%m/%d/')
created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now=True)
class ProductImage(models.Model):
product = models.ForeignKey(Product, related_name='images', on_delete=models.CASCADE)
title = models.CharField(max_length=50, blank=True)
image = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, null=True)
此外,根据要求,有两个字段应导出图像。如果有一张图片(产品 table)应该导出到 item_image_link
,我可以毫无问题地导出它。如果 item_additional_image_link
有多个 (ProductImage table),这就是我遇到的问题。
我像下面一样遍历产品 table,然后尝试查找特定产品 ID 的所有图片,例如:
products = Product.objects.filter(product_status=True)
images = ProductImage.objects.filter(product__id__in=products)
for products in products:
item = ET.SubElement(channel, "item")
g_item_id = ET.SubElement(item, ("{http://base.google.com/ns/1.0}id")).text = products.sku
g_item_image_link = ET.SubElement(item, ("{http://base.google.com/ns/1.0}image_link")).text = 'http://127.0.0.1:8000'+products.image.url
for image in images:
g_item_additional_image_link = ET.SubElement(item, ("{http://base.google.com/ns/1.0}additional_image_link")).text = 'http://127.0.0.1:8000'+image.image.url
但是 g_item_additional_image_link 带来了我在数据库中拥有的所有产品的所有图像。我想问题出在 images query
。我如何显示与每个产品相关的图片?
谢谢
您不需要为图像定义额外的查询,因为 Django 会为您链接它们。 首先,将 prefetch_related 添加到产品查询中。这样 django 就不会在遍历图像时创建第二个查询:
products = Product.objects.filter(product_status=True).prefetch_related('images')
然后,遍历相关图像:
for image in product.images.all():
...
在遍历它们时,您还应该使用 product
而不是 products
。
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.0}id")).text = product.sku
g_item_image_link = ET.SubElement(item, ("{http://base.google.com/ns/1.0}image_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.0}additional_image_link")).text = 'http://127.0.0.1:8000'+image.image.url