Как экспортировать мою модель 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 ответ