【问题标题】:How to return sum according to date range in django?如何根据 django 中的日期范围返回总和?
【发布时间】:2022-10-01 19:50:58
【问题描述】:

如果有人可以帮助我,那就太好了。我被困在这里了。我可以手动执行此操作,但如何根据用户输入执行此操作。

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 所以由和 date_range 创建的 id 总是会改变。并且根据更改总和将返回。

我的模型:

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
  • 请同时更新视图部分!
  • 更新@AbdulNiyasPM

标签: python django


【解决方案1】:

如果要求获取特定日期范围内特定员工创建的所有行,则以下代码可能有效。

要求

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 表中特定范围内与特定员工相关的所有记录,您可以使用提供给指向 customerVisit 表中员工的字段(foreign_key) 的相关名称。

例如,如果 CustomerVisit 模型具有指向 Employee Model 的“phelebotomist_id”外键,您可以通过以下查询获取与 Employee Model 相关的所有 customerVisit 记录

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()

您可以根据日期范围和任何其他字段进一步过滤掉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多