【问题标题】:Python get max price sum 3 top recordsPython获得最高价格总和3条最高记录
【发布时间】:2023-03-20 14:30:01
【问题描述】:

我有一个表格,其中的数据如下:

Id            price             date         user_id    type  match_id
_____________________________________________________________________

1            120              2021-03-05     1        credit    1
2            120              2021-03-05     1        credit    1
3            120              2021-03-08     2        credit    2
4            120              2017-06-20     3        credit    2
5            140              2017-06-20     4        debit     2
6            120              2017-06-20     1        credit    2
8            120              2021-03-09     2        credit    1
9            130              2017-06-20     2        credit    1
10           120              2021-03-05     1        debit     2
11           160              2021-03-05     5        debit     1
12           210              2021-03-05     5        credit    1

我真正想要的是根据 userid 和 created_at 在 2021-03-05 至 2021-03-11 之间使用不同的用户,类型为 credit 3 top price users with price sum。

根据此过滤器具有最大价格总和的 3 个顶级用户。我被困在这里,任何人都可以帮我解决这个问题吗??

我拥有的型号:

class PriceLog(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="price_log")
    type = models.CharField(
        max_length=10,
        choices=(
            ('credit', 'Credit'),
            ('debit', 'Debit')
        ),
    )
    price = models.IntegerField()
    match = models.ForeignKey(Match, on_delete=models.CASCADE, related_name='price_logs', null=True, default=None)
    message = models.CharField(max_length=255, default='')
    created_at = models.DateTimeField(default=timezone.now)

    class Meta:
        db_table = 'price_logs'

【问题讨论】:

  • 请分享您的模型
  • @WillemVanOnsem 我现在用模型更新了我的问题..

标签: python python-3.x django django-rest-framework django-orm


【解决方案1】:

您可以使用:

from django.contrib.auth.models import User
from django.db.models import Sum

User.objects.filter(
    price_log__created_at__range=('2021-03-05', '2021-03-11'),
    price_log__type='credit'
).annotate(
    max_price=Sum('price_log__price')
).order_by('-max_price')[:3]

这是一个QuerySet,它将包含(最多)三个Users,在给定时间范围内具有最高价格,并以credit 作为类型。从此QuerySet 产生的User 对象将具有具有该最高价格的额外属性.max_price


注意:通常使用settings.AUTH_USER_MODEL [Django-doc] 引用用户模型比直接使用User model [Django-doc] 更好。更多信息可以查看referencing the User model section of the documentation


注意:Django 的DateTimeField [Django-doc] 有一个auto_now_add=… parameter [Django-doc] 使用时间戳。这将自动分配当前日期时间 创建对象时,将其标记为不可编辑(editable=False),例如 默认不会出现在ModelForms 中。

【讨论】:

  • 过滤器在用户身上。因此,如果我是正确的,注释将不会使用过滤器(只要用户有一个匹配的价格日志,注释就会使用所有这些)?
  • @AbdulAzizBarkat:它会,您可以过滤将用于聚合的相关模型,因为它充当LEFT OUTER JOIN
  • 我的意思是过滤器只会过滤掉至少有一个匹配价格日志的用户。如果我正确理解 ORM,注释将使用所有用户价格日志之后?
  • @AbdulAzizBarkat:例如在这里我们计算以 Django 开头的书籍的数量:docs.djangoproject.com/en/3.1/topics/db/aggregation/…
  • @AbdulAzizBarkat:例如here 他们使用Publisher.objects.filter(book__rating__gt=3.0).annotate(num_books=Count('book')) 来获取评级> 3..的书籍数量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 2016-01-26
  • 2011-06-16
  • 2023-02-20
  • 2012-06-07
相关资源
最近更新 更多