У меня есть запрос, который вычисляет текущий баланс на основе поля 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.Надеюсь, это имеет смысл.