2

感谢您在这里阅读我的问题。

我正在为一家摄影公司开设网上商店,我需要读取一个 csv 文件来更新数据库中的产品。我正在使用django-adaptors来迭代文件并保存信息,现在第一次运行良好,但如果再次运行该命令,应用程序会创建新对象而不是覆盖现有对象。

问题是我不知道使用更新元选项的正确方法是什么。(您可以在文档中看到它)

这是我现在拥有的代码:

from models import Type, Vendor, Product
from adaptor.model import CsvModel
from adaptor import fields as adaptor_fields

# Prepare functions here, but are not relevant information

class csv(CsvModel):
    mfr_code = adaptor_fields.CharField()
    main_photo_url = adaptor_fields.CharField()
    name = adaptor_fields.CharField()
    product_url = adaptor_fields.CharField()
    vendor = adaptor_fields.CharField(prepare=get_or_create_vendor)
    type = adaptor_fields.CharField(prepare=get_or_create_type)
    subtype = adaptor_fields.IgnoredField()
    description = adaptor_fields.CharField()
    specs = adaptor_fields.CharField()
    tags = adaptor_fields.CharField()
    stock = adaptor_fields.IntegerField(prepare=get_stock_value)
    price = adaptor_fields.IntegerField(prepare=format_usd)

    class Meta:
        delimiter = ','
        dbModel = Product
        update = {
            'keys': ['D1 Basic Kit 250/500', 'D1 Studio Kit 250/250']
        }

正如您在上面看到的,我有带有“键”值的字典,但我不知道如何定义“自然键”列表,并且在尝试运行命令时出现 KeyError 异常。

有人可以解释一下正确的方法是什么吗?

谢谢回答。

克里斯蒂安

4

1 回答 1

2

'keys' 应该指向一个字段名,而不是一个字段值。我猜“D1 Basic Kit 250/500”或“D1 Studio Kit 250/250”是名字,那么你应该有类似的东西:

class csv(CsvModel):
    mfr_code = adaptor_fields.CharField()
    main_photo_url = adaptor_fields.CharField()
    name = adaptor_fields.CharField()
    product_url = adaptor_fields.CharField()
    vendor = adaptor_fields.CharField(prepare=get_or_create_vendor)
    type = adaptor_fields.CharField(prepare=get_or_create_type)
    subtype = adaptor_fields.IgnoredField()
    description = adaptor_fields.CharField()
    specs = adaptor_fields.CharField()
    tags = adaptor_fields.CharField()
    stock = adaptor_fields.IntegerField(prepare=get_stock_value)
    price = adaptor_fields.IntegerField(prepare=format_usd)

    class Meta:
        delimiter = ','
        dbModel = Product
        update = {
            'keys': ['name']   # or mfr_code, main_photo_url, etc..., price
        }
于 2012-11-29T06:13:25.680 回答