2017-01-29 5 views
0

Можно ли сделать что-то вроде этого?Django Feeding ** kwargs into .ggregate()

outputs = {"total_kgs": "kgs"} 
Model.objects.all().aggregate(**outputs) 

вместо:

Model.objects.all().aggregate(total_kgs="kgs") 

Сейчас я получаю:

AttributeError: 'str' object has no attribute 'resolve_expression'

Вот что я сейчас пытаюсь сделать:

класса InventoryManager (управляющего) :

def lookup(self, operators, fields, status, labels=None): 
    outputs = {} 

    if status == "unsold": 
     operators.update({"status__lt": choices.SOLD}) 

    q = [Q(**operators)] 

    for field in fields: 
     label = labels.pop(0) if labels else "{}_total".format(field) 
     outputs.update({label: field}) 

    return self.model.objects.filter(reduce(operator.and_, q)).aggregate(**outputs) 

def total_kgs(self, status='unsold'): 

    operators = {"supplier__market__weights": "KGS"} 
    operators.update({'supplier__market__currency_code':"INR"}) 
    return self.lookup(operators, ["weight", "invoice_value"], status) 

Соответствующая модель данных:

class Purchase(models.Model): 
    invoice = models.CharField(max_length=24, unique=True) 
    lbs = models.DecimalField(decimal_places=4, max_digits=48, blank=True, null=True) 
    kgs = models.DecimalField(decimal_places=4, max_digits=48, blank=True, null=True) 
    invoice_value = models.DecimalField(decimal_places=4, max_digits=48, blank=True, null=True) 
    status = models.IntegerField(choices=choices.STATUS_CHOICES, default=choices.PENDING) 

Вот в конце концов, что я хотел бы сделать для каждого запроса:

self.model.objects.filter(reduce(operator.and_, q)).aggregate(total_weight=Coalesce(Sum("weight"), 0)) 
+2

Проблема не в расширении dict, это само выражение. 'aggregate' не ожидает строки, в которой вы передаете' 'kgs''. Что ты пытаешься сделать? –

+0

Я собираюсь собирать много разных вещей в разное время, поэтому я думал, что смогу построить словари, чтобы перейти к функции, которая распаковывала бы и запускала запрос. Я отправлю код. –

+1

Вы можете это сделать, но аргументы должны быть правильными. Ваш запрос не будет работать, даже если вы передали его явно. –

ответ

0

Так WHADDYA знаю. Если вы вставляете правильные выражения, все работает отлично. Еще раз спасибо.

for field in fields: 
    label = labels.pop(0) if labels else "{}_total".format(field) 
    outputs.update({label: Coalesce(Sum(field), 0)}) 

 Смежные вопросы

  • Нет связанных вопросов^_^