values\u list()是否可以返回名称而不是id?

2024-10-03 11:21:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个这样的模型:

class Budget(models.Model):
    name = models.CharField(max_length=255)

class Transaction(models.Model):
    type = models.CharField(
        max_length=3,
        choices=[('inc', 'Income'), ('exp', 'Expense')],
        default='inc'
    )
    amount = models.DecimalField(max_digits=12, decimal_places=2)
    description = models.TextField()
    added_by = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    date = models.DateTimeField()
    objects = TransactionQuerySet.as_manager()
    budget = models.ForeignKey(Budget, on_delete=models.CASCADE)

…我的TransactionQuerySet上有一个自定义管理器方法:

class TransactionQuerySet(models.QuerySet):

    def categorize_budgets(self):
        return self.model.objects.values_list('budget').annotate(total=Sum('amount'))

我想按预算对费用进行分类并汇总,当我这样做时:

>>> Transaction.objects.filter(added_by=user, type='exp').categorize_budgets()
<TransactionQuerySet [(1, Decimal('4'))]>

它返回的是,我想是预算id)。我想让它返回预算名称而不是,这是可能的?我有这样的解决方法,但我想知道DB是否可以一次性完成所有工作:

def get_expenses(self):
    expenses = Transaction.objects.filter(
        added_by=self.request.user, type='exp'
    ).categorize_budgets()
    mappings = {
        Budget.objects.get(id=k).name: v for k, v in expenses
    }

Tags: selfaddedgetbyobjectsmodelstypemax
1条回答
网友
1楼 · 发布于 2024-10-03 11:21:00

您可以使用常用的Django相关查找,即budget__name

class TransactionQuerySet(models.QuerySet):

    def categorize_budgets(self):
        return self.model.objects.values_list('budget__name').annotate(total=Sum('amount'))

相关问题 更多 >