代码之家  ›  专栏  ›  技术社区  ›  adder

values_list()能否返回名称而不是id?

  •  2
  • adder  · 技术社区  · 5 年前

    我有两个这样的模型:

    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)。我希望它返回预算名称,而不是,这是可能的吗?我有这样的解决方法,但我想知道数据库是否可以一次性完成所有工作:

    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
        }
    
    1 回复  |  直到 5 年前
        1
  •  3
  •   heemayl    5 年前

    您可以使用通常与Django相关的查找,即。 budget__name :

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