0

我有一个 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)

我创建了两个产品来展示我的需求 在此处输入图像描述 例如,在我的 CSV 文件中,我需要为每个尺寸和颜色创建一个新行,以便在 webshop 软件中正确创建变化。

所以我的 CSV 必须看起来像这样:

"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 行相应地写入文件?

4

2 回答 2

2

据我了解,您必须从 Django 数据库值生成 CSV 文件吗?

为了能够在没有我创建Item的与您的模型具有相同字段的真实 Django 模型的情况下重现代码。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 响应

于 2022-01-20T05:51:07.283 回答
0

我有一个包含五个字段的模型,其中两个是多个字段(django-multiselectfield)

我需要为每种尺寸和颜色换一条新线,以便在网上商店软件中正确创建变化。

我会假设每个产品数据库条目都是一个“变量”,然后在为两个多选字段的每个计数写入 CSV 时手动创建“变量”。

于 2022-01-20T05:10:32.453 回答