Как экспортировать мою модель django в пользовательский csv?

У меня есть приложение Django, в котором я поддерживаю товары для интернет-магазина. Поскольку многие продукты имеют несколько вариантов и работа в Excel не является оптимальной, я подумал, что Python может помочь мне и облегчить работу. Однако для импорта в систему моего магазина мне нужен CSV-файл, и вот тут возникает проблема.

У меня есть модель с пятью полями, два из которых являются множественными полями (django-multiselectfield).

SIZES = (('16', 'Size 16'),
              ('17', 'Size 17'),
              ('18', 'Size 18'),
              ('19', 'Size 19'),
              ('20', 'Size 20'))

COLORS = (('white', 'White'),
              ('black', 'Black'),
              ('blue', 'Blue'),
              ('red', 'Red'),
              ('yellow', 'Yellow'))

class Items(models.Model):
    name = models.CharField(_('Name'), max_length=254, null=True, blank=True, default='',)
    sku = models.CharField(_('SKU'), max_length=254, null=True, blank=True, default='',)
    size = MultiSelectField(_('Size'), choices=SIZES)
    color = MultiSelectField(_('Color'), choices=COLORS)
    price = models.DecimalField(_('Price'), max_digits=7, decimal_places=2)
< <
"type","sku","attribute 1 name","attribute 1 value","attribute 2 name","attribute 2 value"
"variable","abc01921","size","16","color","white,black,blue"
"variation","abc01921_white_16","size","16","color","white"
"variation","abc01921_black_16","size","16","color","black"
"variation","abc01921_blue_16","size","16","color","blue"
"variable","abc01831","size","16,17","color","black,blue"
"variation","abc01831_black_16","size","16","color","black"
"variation","abc01831_blue_16","size","16","color","blue"
"variation","abc01831_black_17","size","17","color","black"
"variation","abc01831_blue_17","size","17","color","blue"

Я создал два продукта, чтобы продемонстрировать свои потребности

Как мне лучше всего успешно реализовать это? Как я могу проверить, является ли это переменной или вариацией, и использовать эту информацию для записи строки CSV в файл соответствующим образом?

У меня есть модель с пятью полями, два из которых являются множественными полями (django-multiselectfield)

Мне нужна новая строка для каждого размера и цвета, чтобы вариации создавались правильно в программе интернет-магазина.

<

Насколько я правильно понимаю, вам нужно сгенерировать CSV-файл из значений базы данных Django?

Чтобы иметь возможность воспроизвести код без реальной модели Django, я создал Item, который имеет те же поля, что и ваша модель. Код генерации CSV должен работать для реальных объектов модели Django как есть (в основном... Я не уверен, как модель возвращает значения MultiSelectField).

Создайте список примеров объектов элементов:

class Item:
    def __init__(self, **kw):
        self.name = kw['name']
        self.sku = kw['sku']
        self.size = kw['size']
        self.color = kw['color']
        self.price = kw['price']


items = [
    Item(
        **{
            'name': 'product1',
            'sku': 'abc123',
            'size': ('16', '17'),
            'color': ('green', 'orange'),
            'price': 123
        }
    ),
    Item(
        **{
            'name': 'product2',
            'sku': 'abc321',
            'size': ('61', '71'),
            'color': ('yellow', 'red'),
            'price': 321
        }
    ),
]

Записать файл csv со всеми элементами:

header = ["type", "sku", "attribute 1 name", "attribute 1 value", "attribute 2 name", "attribute 2 value"]
csv_lines = [header]

for item in items:
    csv_lines.append(['variable', item.sku, 'size', ','.join(item.size), 'color', ','.join(item.color)])
    for size_variation in item.size:
        for color_variation in item.color:
            csv_lines.append(['variation', f'{item.sku}_{color_variation}_{size_variation}', 'size', size_variation, 'color', color_variation])


import csv


with open('./csv_file_to_import.csv', 'w', newline='') as csv_file:
    write = csv.writer(csv_file, quoting=csv.QUOTE_ALL)
    write.writerows(csv_lines)

Проверить файл csv:

"type","sku","attribute 1 name","attribute 1 value","attribute 2 name","attribute 2 value"
"variable","abc123","size","16,17","color","green,orange"
"variation","abc123_green_16","size","16","color","green"
"variation","abc123_orange_16","size","16","color","orange"
"variation","abc123_green_17","size","17","color","green"
"variation","abc123_orange_17","size","17","color","orange"
"variable","abc321","size","61,71","color","yellow,red"
"variation","abc321_yellow_61","size","61","color","yellow"
"variation","abc321_red_61","size","61","color","red"
"variation","abc321_yellow_71","size","71","color","yellow"
"variation","abc321_red_71","size","71","color","red"

Если у пользователей вашего Django приложения нет доступа к хранилищу Django сервера, вам следует сделать CSV файл загружаемым через браузер, а не сохранять его на диск. @DarkDrifterX99 уже отвечалкак реализовать CSV ответ

Вернуться на верх