Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过关系外键对Django模型中的查询集进行排序_Django_Rest_Model_Foreign Keys - Fatal编程技术网

如何通过关系外键对Django模型中的查询集进行排序

如何通过关系外键对Django模型中的查询集进行排序,django,rest,model,foreign-keys,Django,Rest,Model,Foreign Keys,我有以下型号 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=25

我有以下型号

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'
)
我正在努力学习如何返回一个类别列表,该列表是按开支模型中挑选最多的类别排序的,如:

<Expense category=3>
<Expense category=3>
<Expense category=2>
<Expense category=3>
<Expense category=1>
<Expense category=1>
用Django的可爱的

我们可以利用以下方法实现这一目标:

from django.db.models import Count

...

queryset = Category.objects.annotate(expense_count=Count('expense')).order_by('-expense_count')
从django.db.models导入计数
Category.objects.annotation(expense\u count=count('Category')).order\u by('-expense\u count'))
这是基于您的模型定义,但我建议将
相关的\u名称
修改为与
费用
相关的术语,例如
费用
。由于
相关的\u名称
指示您用于反向查询的名称。

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

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

...

queryset = Category.objects.annotate(expense_count=Count('expense')).order_by('-expense_count')
queryset = Category.objects.order_by("-expense__expense").distinct('category')