【问题标题】:How to get list of related object in annotion when using Greatest function in django models在 django 模型中使用 Greatest 函数时如何获取注释中相关对象的列表
【发布时间】:2020-10-04 19:43:33
【问题描述】:

我有两个模型,一个User 模型和一个Payment 模型,它们之间有很多关系。 User 有多个 Payments。我想要实现的是根据Paymentcreated_at 字段对User 模型进行排序。

我正在尝试修改查询集,然后我将使用带注释的字段latest_tran 进行排序。

def get_queryset(self, request):
    qs = super(ClubbedPaymentAdmin, self).get_queryset(request)
    qs = qs.annotate(
        latest_tran=Greatest(Payment.objects.filter(user=F('id')).values_list('created_at', flat=True)))
    return qs

但我有以下错误。

Greatest must take at least two expressions

所以在评估Payments 的列表时,我似乎犯了一个错误。或者可能就像我采取了错误的方法。 任何帮助将非常感激。 谢谢。

编辑

我正在为django 中的用户使用默认的User 模型

我的Payment 模型看起来像这样 -

class Payment(models.Model):
    amount = models.FloatField('Points', max_length=10)
    purchase_token = models.TextField(max_length=250)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    note = models.TextField(max_length=1000, default=None, blank=True)
    created_at = models.DateTimeField('Transaction Date')
    updated_at = models.DateTimeField('Updated at', auto_now=True)

【问题讨论】:

  • 你能分享你的模型吗?

标签: python python-3.x django django-models


【解决方案1】:

Greatest 不取最大值,它取不同参数中的最大值,所以Greatest('foo', 'bar') 将取foobar 列中的最大值。

您需要的是Max [Django-doc]。您可以使用以下划线分隔的名称,因此:

from django.db.models import Max

def get_queryset(self, *args, **kwargs):
    return super().get_queryset(*args, **kwargs).annotate(
        latest_tran=Max('payment__created_at')
    )

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

【讨论】:

  • 感谢您的回答。它解决了我的问题。也感谢您的说明。
【解决方案2】:

类似这样的东西,使用Max(...)

from django.db.models import Max


def get_queryset(self, request):
    qs = super(ClubbedPaymentAdmin, self).get_queryset(request)
    qs = qs.annotate(latest_tran=Max('payment__created_at'))
    return qs

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 2022-10-06
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多