Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.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_Django Models_Django Views_Django Orm_Django Class Based Views - Fatal编程技术网

如何使用基于类的视图按Django中相关字段的总和排序?

如何使用基于类的视图按Django中相关字段的总和排序?,django,django-models,django-views,django-orm,django-class-based-views,Django,Django Models,Django Views,Django Orm,Django Class Based Views,如果我有这样一个代理模型: class Agent(models.Model): name = models.CharField(max_length=100) class Deal(models.Model): agent = models.ForeignKey(Agent, on_delete=models.CASCADE) price = models.IntegerField() from django.views.generic import ListVie

如果我有这样一个代理模型:

class Agent(models.Model):
    name = models.CharField(max_length=100)
class Deal(models.Model):
    agent = models.ForeignKey(Agent, on_delete=models.CASCADE)
    price = models.IntegerField()
from django.views.generic import ListView

class AgentListView(ListView):    
    model = Agent
一个相关的模型如下所示:

class Agent(models.Model):
    name = models.CharField(max_length=100)
class Deal(models.Model):
    agent = models.ForeignKey(Agent, on_delete=models.CASCADE)
    price = models.IntegerField()
from django.views.generic import ListView

class AgentListView(ListView):    
    model = Agent
一个看起来像这样的视图:

class Agent(models.Model):
    name = models.CharField(max_length=100)
class Deal(models.Model):
    agent = models.ForeignKey(Agent, on_delete=models.CASCADE)
    price = models.IntegerField()
from django.views.generic import ListView

class AgentListView(ListView):    
    model = Agent
我知道我可以在
queryset
中调整代理的排序顺序,我甚至知道如何根据代理的交易数量对代理进行排序,如下所示:

queryset = Agent.objects.all().annotate(uc_count=Count('deal')).order_by('-uc_count')

但是,我不知道如何根据每个代理的交易价格总和对交易进行排序。

如果您已经知道如何根据这些注释进行注释和排序,那么您已经完成了90%的步骤。您只需要使用
Sum
aggregate并向后跟踪关系

委员会:

您应该能够执行类似的操作:

queryset = Agent.objects.all().annotate(deal_total=Sum('deal__price')).order_by('-deal_total')

我敏锐的感觉告诉我,您可能需要在总和中添加一个
distinct=True
,但如果不进行测试,我不确定。

根据您在他的回答中提出的答案和问题,这可能是您正在寻找的解决方案:

from django.db.models import Case, IntegerField, When

queryset = Agent.objects.all().annotate(
    deal_total=Sum('deal__price'),
    o=Case(
        When(deal_total__isnull=True, then=0), 
        default=1, 
        output_field=IntegerField()
    )
).order_by('-o', '-deal_total')
说明:
发生的情况是,
deal\u total
字段将
deal
s对象的
price
相加,但是如果
代理开始时没有
deal
s,那么
price
s的总和就是
None
对象能够将
0
的值分配给
deal\u total
s时,如果没有该值,该值将被指定为
None

按字段添加distinc,否则,该对象的
ID可能无法用于某些数据库(您好,MySQL),这几乎是完美的!我遇到一个小问题,出于某种原因,总和为0的代理对象的位置高于总和大于0的代理对象。然而,在那之后,总和的顺序是完美的。知道为什么会这样吗?嗯,奇怪。看起来好像有同样的问题。