Django - Подробная информация о продукте в XML-файле

У меня есть задача экспортировать все детали продукта, такие как название, цена и т.д. из базы данных в 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, и я экспортирую его без проблем. А если их несколько (таблица ProductImage), то в item_additional_image_link и вот здесь у меня возникает проблема.

Я выполняю итерации по таблице продуктов, как показано ниже, а затем пытаюсь найти все изображения для определенного идентификатора продукта, например:

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к запросу products. Таким образом, 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
Вернуться на верх