Django: Загрузка нескольких каталогов изображений одновременно
В моем проекте Django я хочу загружать массовые изображения для продуктов из каталога каталогов. Каждый каталог назван по SKU для продукта. В каждом каталоге может быть несколько изображений, а может и не быть. Как я могу достичь этой функциональности?
Мои модели:
class Product(models.Model):
    sku = models.CharField('SKU', max_length = 200)
    name = models.CharField('Name', max_length = 1000)
    price = models.CharField('Price', max_length = 200)
    quantity = models.CharField('Quantity', max_length = 200)
    class Meta:
        verbose_name = 'Product'
        verbose_name_plural = 'Products'
    def __str__(self):
        return self.name
class Image(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name='product_image')
    image = models.ImageField(upload_to='images/')
    class Meta:
        verbose_name = 'Image'
        verbose_name_plural = 'Images'
    def __str__(self):
        return str(self.image)
Мой urls.py
from django.urls import path
from . import views
urlpatterns = [
    path('products/', views.products, name="products"),
    path('products_import/', views.products_import, name="products_import"),    
]
Мой views.py
def products_import(request):
    heading = 'Upload Products'
    info = '''This importer will import the following fields: sku, name, price, quantity from a csv file.'''
    if request.method == 'POST':
        paramFile = io.TextIOWrapper(request.FILES['file'].file, encoding='latin-1')
        product = csv.DictReader(paramFile)
        list_of_dict = list(product)
        objs = [
            Product(
                sku=row['sku'],
                name=row['name'],
                price=row['price'],
                quantity=row['quantity'],
         )
         for row in list_of_dict
        ]
        record_count = len(list_of_dict)
        try:
            msg = Product.objects.bulk_create(objs)
            messages.success(request, str(record_count) + ' records were uploaded.')
            return redirect('products_import')
        except Exception as e:
            error_message = 'Error While Importing Data: ',e
            messages.error(request, error_message, e)    
            return redirect('products_import')
    context = {'heading': heading, 'info': info}
    return render(request, 'coreapp/product/products_import.html', context)
Я могу загрузить большое количество товаров, используя нижеприведенный CSV и вышеприведенный вид.
Внутри каждой папки SKU есть несколько изображений.
Я хочу загрузить изображения из папок сразу и связать их с соответствующими SKU. Как я могу этого добиться? Любое руководство будет высоко оценено.
NB: Я могу загрузить одно изображение для продукта. Если мы хотим загрузить тысячи продуктов и связанных с ними изображений, загрузка одного изображения не является целесообразным решением.
Скопируйте & вставьте изображения в каталог MEDIA_ROOT + '/images' вручную.
Используйте пользовательскую команду вместо представления. Это будет более полезно и удобно в таких случаях. Вот ссылка как это сделать.
Основная часть команды выглядит следующим образом.
import os
from django.conf.settings import MEDIA_ROOT
...
for data in products_data:
    product = Product.objects.create(sku=data['sku'], ...)
    images = os.listdir(os.path.join(MEDIA_ROOT, 'images'))
    for image in images:
        Image.objects.create(
            product=product,
            image=f'images/{product.sku}/image'
        )
Убедитесь, что в каталоге images нет ни одного файла, кроме images.

