【发布时间】:2021-07-09 09:08:00
【问题描述】:
我必须每 1 小时处理一次项目报告 CSV 文件。 CSV 包含 1 个帐户的 150k+ 条记录,并且我的系统中有多个帐户。我以前在 Rails 上工作,并且有活动记录 gem 可以非常有效地处理这个用例。我正在寻找 Django 中此 gem 的替代方法或任何有助于批量导入此类大数据的内置方法。
到目前为止,我已经尝试过这段代码。
class ItemReportService:
def call(self, file_url):
with open(file_url, 'r') as file:
reader = csv.DictReader(file)
products = []
for row in reader:
product = self.process_product(row)
products.append(product)
self.update_products(products)
def process_product(self, row):
print(f'Processing sku: {row["SKU"]}')
product = Product.objects.filter(
sku=row['SKU']).first() or Product(sku=row['SKU'])
product.listing_title = row['Product Name']
product.listed_price = row['Price']
product.buy_box_price = row['Buy Box Item Price'] + \
row['Buy Box Shipping Price']
product.status = row['Lifecycle Status']
return product
def update_products(self, products):
Product.objects.bulk_update(
products,
[
'listing_title',
'listed_price',
'buy_box_price',
'Lifecycle Status'
]
)
它引发了这个异常,因为当有一个新产品时它没有分配主键
ValueError: 所有 bulk_update() 对象都必须有一个主键集。
【问题讨论】:
-
您必须先创建和获取/过滤对象。然后对对象实例进行批量更新。
-
谢谢 Siva 我已经试过了。我只想根据 SKU 查找产品,所以它会引发错误,不要将其余字段留空。
-
谢谢詹姆斯知道了。
标签: python-3.x django