Django / DRF: расчет текущего баланса с использованием оконной функции с неуникальным полем - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть запрос, который вычисляет текущий баланс на основе поля amount моего Transaction и сортируется по created_time.Это отлично подходит для получения точного баланса, когда date и created_time - это один и тот же день.Однако date не всегда будет соответствовать created_time транзакции.Можно ли использовать date для расчета текущего баланса?

Текущий запрос:

queryset = self.queryset.annotate(balance=Window(Sum('amount'), order_by=F('created_time').asc())).all().order_by('-created_time')

Полное использование:

class TransactionViewSet(viewsets.ModelViewSet):
    queryset = Transaction.objects.all()
    serializer_class = TransactionSerializer

    def list(self, request, *args, **kwargs):
        queryset = self.queryset.annotate(balance=Window(Sum('amount'), order_by=F('created_time').asc())).all().order_by('-created_time')  # noqa: E501

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

Модель:

class Transaction(models.Model):
    date = models.DateField()
    payee = models.CharField(max_length=256)
    category = models.CharField(max_length=256)
    amount = MoneyField(max_digits=19,
                        decimal_places=2,
                        default_currency='USD')
    memo = models.CharField(max_length=256)
    is_cleared = models.BooleanField()
    paid_or_deposited = models.BooleanField()
    created_time = models.DateTimeField(db_index=True,  # maybe remove the index
                                        auto_now_add=True)
    modified_time = models.DateTimeField(auto_now=True)

Сериализатор:

class TransactionSerializer(serializers.ModelSerializer):
    balance = serializers.DecimalField(
        decimal_places=2, max_digits=19, read_only=True)

    class Meta:
        """Meta class to map serializer's fields with the model fields."""
        model = Transaction
        fields = ('id', 'date', 'payee', 'category',
                  'amount', 'balance', 'created_time', 'modified_time', 'is_cleared', 'paid_or_deposited')

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

Проблема с текущим запросом состоит в том, что я могу ввести транзакцию 25/12/2018 с date от 20.12.2008.В результате эта новая транзакция возвращает сортировку с другими транзакциями от 25.12.2008, где я хочу, чтобы она была отсортирована с транзакциями от 20.12.2008.Надеюсь, это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...