感谢您在这里阅读我的问题。
我正在为一家摄影公司做网上商店,我需要阅读一个csv文件来更新数据库上的产品。我使用django-adaptors来迭代文件并保存信息,现在第一次工作正常,但如果再次运行命令,应用程序会创建新对象而不是覆盖现有对象。
问题是我不知道使用Update meta选项的正确方法是什么。 (你可以在the documentation)
中看到它这是我现在的代码:
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']
}
正如您在上面所看到的,我有一个带有'keys'值的字典,但我不知道如何定义'自然键'列表,我在尝试运行命令时遇到了KeyError异常。 / p>
有人可以解释一下以正确的方式做到这一点的方法是什么?
感谢您的回答。
的Cristian
答案 0 :(得分: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
}