Django - XML 文件中的产品详细信息

Posted

技术标签:

【中文标题】Django - XML 文件中的产品详细信息【英文标题】:Django - Product Details in XML file 【发布时间】:2022-01-22 01:25:57 【问题描述】:

我的任务是将所有产品详细信息(例如名称、价格等)从 db 导出到 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)

此外,根据要求,还有两个应导出图像的字段。如果有一个图像(产品表)应该导出到item_image_link,我可以毫无问题地导出它。如果item_additional_image_link 有多个(ProductImage 表),这就是我有问题的地方。

我遍历下面的产品表,然后尝试查找特定产品 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.0id")).text = products.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 images:
    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

但是 g_item_additional_image_link 为我在数据库中为所有产品带来了所有图像。我想问题出在images query。如何显示与每个产品相关的图像?

谢谢

【问题讨论】:

【参考方案1】:

您不需要为图像定义额外的查询,因为 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.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

【讨论】:

感谢您的帮助!我按照您上面的建议进行了修改,但我得到了TypeError: 'RelatedManager' object is not iterable。有什么想法吗? 我添加了for image in product.images.all(),它成功了。谢谢。 是的,对不起,我的错。将调整答案。 顺便说一句,我不知道在同一个q中问它是否正确?但是如果我想在用逗号分隔的同一行上显示结果,我该怎么做?谢谢! 你想在哪里展示这个?在您的 XML 输出中?也许你最好为此提出一个新的具体问题。

以上是关于Django - XML 文件中的产品详细信息的主要内容,如果未能解决你的问题,请参考以下文章

Django:在模态中使用 Ajax 显示产品详细信息数据

xml 标签式产品详细信息示例

如何使用 Django 在网页中显示 json 详细信息? [关闭]

怎么样C语言解析一个XML文件中的信息,题目很详细,跪求高人指点。

详细magento文件与xml的对应关系

Django查询数据命令详细