【问题标题】:how to order a queryset in Django model by relational foreign key如何通过关系外键在 Django 模型中排序查询集
【发布时间】:2020-05-10 15:44:30
【问题描述】:

我有以下型号

models.py

class Category(models.Model):
      label = models.CharField(max_length=100, unique=True)
      description = models.CharField(max_length=255, blank=True)

class Expense(models.Model):
    description = models.CharField(max_length=255, blank=True)
    amount = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    category = models.ForeignKey(
        Category,
        on_delete=models.CASCADE,
        null=True,
        related_name='category'
)
class CategoryViewSet(viewsets.ModelViewSet):
    queryset = Category.objects.order_by("-expense__expense")

我正在苦苦思考如何返回按费用模型中选择最多的类别排序的类别列表,例如:

<Expense category=3>
<Expense category=3>
<Expense category=2>
<Expense category=3>
<Expense category=1>
<Expense category=1>

我想按这个顺序返回:

<Category id=3>
<Category id=1>
<Category id=2>

解决方案是使用注释:

queryset = Category.objects.annotate(
        expense_count=Count('category')).order_by('-expense_count')

【问题讨论】:

    标签: django rest model foreign-keys


    【解决方案1】:

    使用 Django 的可爱aggregation features

    queryset = Category.objects.annotate(expense_count=Count('expense')).order_by('-expense_count')
    

    【讨论】:

      【解决方案2】:

      我们可以使用annotate 来实现:

      from django.db.models import Count
      
      ...
      
      queryset = Category.objects.annotate(expense_count=Count('expense')).order_by('-expense_count')
      

      【讨论】:

        【解决方案3】:
        from django.db.models import Count
        
        Category.objects.annotate(expense_count=Count('category')).order_by('-expense_count')
        

        这是基于您的模型定义,但我建议应将related_name 修改为与Expense 相关的术语,例如expenses。由于related_name 表示您用于反向查询的名称。

        【讨论】:

          【解决方案4】:

          只需在查询末尾添加 .distinct('field-name') 即可。像这样

          queryset = Category.objects.order_by("-expense__expense").distinct('category')
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-10-26
            • 2012-11-18
            • 1970-01-01
            • 1970-01-01
            • 2020-04-20
            • 1970-01-01
            • 2020-01-11
            • 1970-01-01
            相关资源
            最近更新 更多