我有一个模型代表一些库存商品:
(代码已简化)
class StockItem(models.Model):
name = models.CharField()
category = models.Charfield()
stock = models.ForeignKey(Stock) # <- Here is few stocks
quantity = models.IntegerField(default=0)
因此,每个StockItem可能存在于不同的库存中,但剩余数量不同。 有没有办法创建 ModelResource 来导出每个库存的剩余数量?
表格示例:
+----+--------+----------+---------+---------+
| ID | Name | Category | Stock A | Stock B |
+----+--------+----------+---------+---------+
| 1 | Item 1 | Cat 1 | 1 | 1 |
| 2 | Item 2 | Cat 2 | 10 | 8 |
| 3 | Item 3 | Cat 3 | 14 | 32 |
+----+--------+----------+---------+---------+
我的模型资源:
class StockItemsRemainingsResource(resources.ModelResource):
class Meta:
model = models.StockItem
fields = ('name', 'category')
def __init__(self):
super().__init__()
for item in self.get_queryset():
stock_name = item.stock.name
self.fields[f"quantity_{stock_name}"] = fields.Field(
attribute="quantity",
column_name=stock_name,
widget=widgets.ForeignKeyWidget(
models.Stock,
"pk"
)
)
我试图重写
__init__
方法,但可能做错了。
after_export()
方法以在初始导出后修改数据集。
您可以根据需要向数据集附加一列。
例如,您可以将类似这样的方法添加到
StockItemsRemainingsResource
:
def after_export(self, queryset, dataset, **kwargs):
counts = []
for d in dataset.dict:
stock_count = Stock.objects.filter(d["name"]).count()
counts.append(stock_count)
dataset.append_col(counts, header="count")
您可以尝试一下以找到执行此操作的最佳方法。 这效率很低,因此可能不适用于大型数据集。
请参阅 tablib 文档。