如何使用基于类的视图按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的代理对象。然而,在那之后,总和的顺序是完美的。知道为什么会这样吗?嗯,奇怪。看起来好像有同样的问题。