簡體   English   中英

在 Django 模型中使用 Greatest 函數時如何獲取注釋中的相關對象列表

[英]How to get list of related object in annotion when using Greatest function in django models

我有兩個模型,一個User模型和一個Payment模型,它們之間有很多關系。 User有多個Payment 我想要實現的是根據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

因此,在評估Payment列表時,我似乎犯了一個錯誤。 或者可能就像我采取了錯誤的方法。 任何幫助將非常感激。 謝謝你。

編輯

我正在為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)

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模型 [Django-doc] 有關更多信息,您可以查看文檔引用User模型部分

像這樣的東西,使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM