Как вернуть сумму по диапазону дат в django?

Было бы очень хорошо, если бы кто-нибудь помог мне с этим. Я застрял здесь. Я могу сделать это вручную, но как сделать в соответствии с пользовательским вводом.

Payment.objects.filter(created_by=42, mode='cash', created_at__range=["2021-11-01", "2021-11-04"]).aggregate(Sum('amount'))

Здесь created_by и date_range я отправляю в url вот так : http://127.0.0.1:8000/api/v1/registration/?created_by=42&start_date=2021-06-06&end_date=2021-11-18 Таким образом, id created by и date_range всегда будут меняться. И в соответствии с изменением сумма будет возвращаться.

Моя модель :

class Payment(TimestampedModel):
    customer_visit = models.ForeignKey(
        CustomerVisit, on_delete=models.CASCADE, null=True, related_name="customer_payments"
    )
    mode = models.CharField(choices=PAYMENTCHOICES, max_length=25)
    amount = models.FloatField()
    ref_no = models.TextField(null=True)
    bank = models.ForeignKey(
        "BankDetails", on_delete=models.CASCADE, null=True, related_name="payment_bank"
    )
    is_settlement = models.BooleanField(default=False)
    created_by = models.ForeignKey("Employee", on_delete=models.DO_NOTHING, null=True,related_name='payment_created_by')
    updated_by = models.ForeignKey("Employee", on_delete=models.DO_NOTHING, null=True,related_name='payment_updated_by')

Мое мнение :

class UserWiseCollectionView(ListAPIView):
permission_classes = [
    IsAuthenticated,
]
pagination_class = CustomPagination
model = CustomerVisit
serializer_class = UserWiseCollectionSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['created_by']

def get_queryset(self):
    start_date = self.request.query_params.get("start_date")
    end_date = self.request.query_params.get("end_date")
    emp_id = self.request.query_params.get("emp_id")
    items = self.model.objects.all()
    if start_date and end_date:
        items = items.filter(
            created_at__range=[start_date, end_date]
        )
        if emp_id is not None:
            items = items.filter(phelebotomist_id = emp_id)
    return items

Если требуется получить все строки, созданные конкретным сотрудником в определенном диапазоне дат, нижеприведенный код может сработать.

Требование

Payment.objects.filter(created_by=42, mode='cash', created_at__range=["2021-11-01", "2021-11-04"]).aggregate(Sum('amount'))

Просмотр кода

def get_queryset(self):
start_date = self.request.query_params.get("start_date")
end_date = self.request.query_params.get("end_date")
emp_id = self.request.query_params.get("emp_id")
employee = Employee.objects.get(pk=emp_id)
payment_by_employee = employee.payment_created_by.all()
if start_date and end_date:
    payment_by_employee = payment_by_employee.filter(
        created_at__range=[start_date, end_date], mode='cash'
    )

payment_by_employee.aggregate(Sum('amount'))
return payment_by_employee

Если вам нужны все записи, относящиеся к определенному сотруднику в определенном диапазоне в таблице CustomerVisit, вы можете использовать связанное имя, которое предоставляется полю (foreign_key), указывающему на сотрудника в таблице CustomerVisit.

Например, если модель CustomerVisit имеет внешний ключ "phelebotomist_id", который указывает на модель Employee, вы можете получить все записи customerVisit, связанные с моделью Employee, с помощью следующих запросов

CustomerVisit(models.Model):
    phelebotomist_id = models.ForeignKey(Employee, related_name="employee_customer_visit")

emp = Employee.objects.get(pk=<emp_id>)
customer_visits_related_to_emp = emp.employee_customer_visit.all()

Вы можете отфильтровать дальше в зависимости от диапазона дат и любых других полей.

Вернуться на верх