如何导出到 Excel Django 对象,其中每个外键对象都是一个带有导入导出库的新列?

问题描述 投票:0回答:1

我有一个模型代表一些库存商品:

(代码已简化)

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__
方法,但可能做错了。

python django django-import-export
1个回答
0
投票

可以重写

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 文档

© www.soinside.com 2019 - 2024. All rights reserved.