Django Queryset получает последовательность объектов вместо результата Sum - PullRequest
0 голосов
/ 12 февраля 2020

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

Car  Week     Payment
1   2020-W06  $500
1   2020-W06  $300
2   2020-W06  $200
1   2020-W05  $500

Итак, я перехожу к запросу автомобиль и неделю, и он должен получить сумму платежей в соответствии с этими значениями

Я передаю автомобиль = 1 и Неделя = 2020-W06 и Сумма платежа = 800

это мой набор запросов:

payed = Pagos.objects.filter(carro_id=1, semana=semana).annotate(total=Sum('pago'))

и вот результат, который я получаю:

<Pagos: Pagos object (6)>, <Pagos: Pagos object (12)>]

Я не понимаю, почему я не получите сумму

models.py

    class Pagos(models.Model):

        carro = models.ForeignKey(
            Carros, on_delete=models.CASCADE, blank=False, null=False)
        pago = models.DecimalField(max_digits=6, decimal_places=2)
        fecha = models.DateField(
            auto_now=False, auto_now_add=False, blank=True, null=True)
        semana = models.CharField(max_length=20)
        startweek = models.DateField(
            auto_now=False, auto_now_add=False, blank=True, null=True)
        endweek = models.DateField(
            auto_now=False, auto_now_add=False, blank=True, null=True)
        renta = models.ForeignKey(
            Renta, on_delete=models.PROTECT, blank=False, null=False)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)

        class Meta:
            verbose_name_plural = "Pagos"

        def get_absolute_url(self):
            return reverse('pagos')


    class Carros(models.Model):

        nombre = models.CharField(max_length=20, blank=True, null=True)
        marca = models.CharField(max_length=25)
        modelo = models.CharField(max_length=25)
        year = models.IntegerField()
        placa = models.CharField(max_length=10, unique=True)
        color = models.CharField(max_length=10)
        conductor = models.ForeignKey(
            Conductores, on_delete=models.SET_NULL, blank=True, null=True)
        propietario = models.ForeignKey(Propietarios, on_delete=models.CASCADE)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)

        class Meta:
            verbose_name_plural = "Vehículos"

        def __str__(self):
            return self.nombre

        def get_absolute_url(self):
            return reverse('carros')

1 Ответ

1 голос
/ 12 февраля 2020

В соответствии с документами, аннотирование добавляет поле к каждому объекту вашей модели, поэтому вы получаете сумму и можете получить к ней доступ следующим образом ( документы ):

payed[0].total

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

payed = Pagos.objects.filter(carro_id=1, semana=semana).aggregate(total=Sum('pago'))
print(payed)
# {total: x}

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

...