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))
Проблема не в расширении dict, это само выражение. 'aggregate' не ожидает строки, в которой вы передаете' 'kgs''. Что ты пытаешься сделать? –
Я собираюсь собирать много разных вещей в разное время, поэтому я думал, что смогу построить словари, чтобы перейти к функции, которая распаковывала бы и запускала запрос. Я отправлю код. –
Вы можете это сделать, но аргументы должны быть правильными. Ваш запрос не будет работать, даже если вы передали его явно. –