2010-03-20 1 views
2

У меня есть следующая (сильно упрощенная) таблица структура:Джанго выбор различна сумма

Order: 
    order_number = CharField 
    order_invoice_number = CharField 
    order_invoice_value = CharField 

номер счет-фактуры может быть одинаковым на более чем одного заказе (заказ О1 имеет номер счета-фактуры I1, порядок О2 имеет номер счет-фактуры I1 , и т.д.). Все заказы с одинаковым номером счета-фактуры имеют одно и то же значение счета-фактуры.

Например:

Order no. Invoice no. Value 
O1   I1    200 
O2   I1    200 
O3   I1    200 
04   I2    50 
05   I3    100 

То, что я пытаюсь сделать, это сделать сумму по всем значениям счета-фактуры, но не добавлять счета-фактуры с тем же числом более чем один раз. Сумма для вышеуказанных пунктов: 200 + 50 + 100.

Я попытался сделать это с помощью

s = orders.values('order_invoice_id').annotate(total=Sum('order_invoice_value')).order_by() 

и

s = orders.values('order_invoice_id').order_by().annotate(total=Sum('order_invoice_value')) 

, но я не получил желаемого результата. Я попробовал несколько разных решений из похожих вопросов, но я не мог получить желаемый результат.

Я не могу понять, что я делаю неправильно, и что я на самом деле должен сделать, чтобы получить сумму, которая использует каждую стоимость счета только один раз.

Edit:

Я просто понял, что на O5 я написал I2 вместо I3. Теперь это написано правильно.

Желаемый результат для данных, приведенных выше, представляет собой сумму каждого значения счета, используемого только один раз. Сумма = I1 + I2 + I3 = 200 + 50 + 100 = 350

+0

Пожалуйста, добавьте ожидаемые илирезультаты. Например: I1 total = 600, I2 total = 150. – istruble

+0

Я отредактировал свой вопрос и добавил желаемый результат, а также нашел ошибку в данных, которые я написал. – yoshi

ответ

1

Я бы сказал, что ваша структура модели неверна. У вас должна быть одна таблица для заказа, содержащая номер и значение заказа, а также отдельная связанная таблица для счетов-фактур с внешним ключом из счета-фактуры для заказа. Тогда ваш запрос будет простым.