1

推定:

class ItemToBill(models.Model):
    date_to_bill = fields.DateField()
    description = fields.charfield()
    customerToBill = fields.ForeignKey(Customer)

今日までに請求する必要があるすべてのアイテムを検索し、それらを顧客ごとにグループ化して、必要な顧客ごとに 1 つの請求書を作成できるようにしたいと考えています。

for unique_customer in all_unique_customers_with_items_to_bill:
    createInvoice(unique_customer,  their_items_to_bill)

おそらく、アイテムを照会して (顧客による注文)、新しい顧客の一連のアイテムをいつ入力したかを特定することができます。これは次のようになります。

items = ItemToBill.objects.filter(date_to_bill=BEFORE_TODAY).order_by(customer)
prevCustomer = items[0].customer
customer_items = []
for item in items:
    if prevCustomer != item.customer:
        createInvoice(prevCustomer, customer_items)
        customer_items = []
        prevCustomer = item.customer
    customer_items.append(item)
createInvioce(prevCustomer, customer_items) #Handle the last customer

しかし、もっと賢い解決策が必要です。提案?

4

2 に答える 2

2

単純なループのように聞こえる、顧客ごとのアイテムのリストが必要です。

items_by_customer = {}

for item in ItemToBill.objects.filter(...date_query...):
    items_by_customer.setdefault(item.customerToBill, []).append(item)

for customer, items in items_by_customer.items():
    print customer, items # items grouped by customer.
    # generate_invoice(customer, items)
于 2012-08-19T17:05:15.400 に答える
0

おそらく最初に、各顧客のすべてのレコードを辞書に集約します。

from collections import defaultdict
items = ItemToBill.objects.filter(date_to_bill=BEFORE_TODAY).order_by(customer)
bills_by_customer = defaultdict(list)
for bill in items:
    bills_by_customer[bill.customer.pk].append(bill)

次に、グループ化された辞書を反復処理できます。

for customer_pk, bills in bills_by_customer.iteritems():
    createInvoice(customer_pk, bills)
于 2012-08-19T17:05:33.850 に答える