Django导入导出导出前编辑查询集

2024-09-29 06:23:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过模型计算未决金额,并将结果导出到csv中。但是csv显示amountpending的空列

class FinancePendingResource(resources.ModelResource):

    invoiceNumber = Field(attribute='invoiceNumber', column_name='Invoice Number')
    student = Field(attribute='student', column_name='Student')
    Schedule = Field(attribute='Schedule', column_name='Schedule')
    TotalAmount = Field(attribute='TotalAmount', column_name='Total Value(PKR ₨)')
    issueDate = Field(attribute='issueDate', column_name='Issue Date')
    dueDate = Field(attribute='dueDate', column_name='Due Date')
    amountPaid = Field(attribute='amountPaid', column_name='Amount Paid (PKR ₨)')


    class Meta:
        model = FinancePending
        import_id_fields = ('invoiceNumber',)
        fields = ('invoiceNumber', 'student', 'amountPaid', 'issueDate', 'dueDate', 'Schedule', 'TotalAmount',
                  'AmountPending',)
        exclude = ('id',)
        skip_unchanged = True
        report_skipped = True

        def before_export(self, queryset, *args, **kwargs):
            amount_paid = FinancePending.objects.values_list('amountPaid', flat=True)
            amount_paid = list(amount_paid)
            total_amount = FinancePending.objects.values_list('TotalAmount', flat=True)
            total_amount = list(total_amount)

            # total - paid
            TotalFee = [float(s.replace(',', '')) for s in total_amount]
            AmountPaid = [float(s.replace(',', '')) for s in amount_paid]

            def Diff(li1, li2):
                return (list(set(li1) - set(li2)))

            amount_pending = Diff(TotalFee, AmountPaid)

            finance_pending = FinancePending()
            i = 1
            while i <= len(amount_pending):
                FinancePending.objects.filter(invoiceNumber=i).update(AmountPending=str(amount_pending[i]))
                i = i + 1

            queryset.refresh_from_db()

Tags: nametruefieldattributecolumnamountlisttotal
1条回答
网友
1楼 · 发布于 2024-09-29 06:23:20

假设数据集中已经有了要计算的数据amountPending,也许您不需要从数据库中读取数据:您可以通过在内存中处理数据集来计算数据量。这可以在^{}中完成。然后可以将计算列添加到数据集中

也许tablib的dynamic columns可以帮助添加amountPending列:

import decimal
import tablib

headers = ('invoiceNumber', 'amountPaid', 'totalAmount')
rows = [
    ('inv100', '100.00', "500.00"),
    ('inv101', '200.00', "250.00")
]

def amount_pending(row):
    return decimal.Decimal(row[2]) - decimal.Decimal(row[1])

data = tablib.Dataset(*rows, headers=headers)
data.append_col(amount_pending, header="amountPending")
print(data)

这将产生以下结果:

invoiceNumber|amountPaid|totalAmount|amountPending
      -|     |     -|      -
inv100       |100.00    |500.00     |400.00       
inv101       |200.00    |250.00     |50.00   

相关问题 更多 >