Django筛选管理器

Django筛选管理器,django,django-models,django-queryset,django-filter,django-managers,Django,Django Models,Django Queryset,Django Filter,Django Managers,我已经被困在这几个星期了,我相信答案非常简单,但不知何故,我在网上找不到它。这让我觉得我完全错了 我想做的就是能够根据软件包过滤我的统计数据,比如get\u max\u winning\u trade功能。我哪里做错了?作为旁注,get\u maximum\u winning\u trade显示了交易模型中的最大赢家交易,但未根据我的标准对其进行筛选。例如“用户” 经理.py from django.db import models class TradeQuerySet(models.Que

我已经被困在这几个星期了,我相信答案非常简单,但不知何故,我在网上找不到它。这让我觉得我完全错了

我想做的就是能够根据软件包过滤我的统计数据,比如
get\u max\u winning\u trade
功能。我哪里做错了?作为旁注,
get\u maximum\u winning\u trade
显示了交易模型中的最大赢家交易,但未根据我的标准对其进行筛选。例如“用户”

经理.py

from django.db import models

class TradeQuerySet(models.QuerySet):

    def get_users_trades(self, username):
        return self.filter(user__username=username)

class TradeManager(models.Manager):

    def get_queryset(self):
        return TradeQuerySet(self.model, using=self._db)

    def get_users_trades(self, username):
        return self.get_queryset().get_users_trades(username)

    def get_largest_winning_trade(self):
        return max([t.profit_loss_value_fees for t in self.all()])
views.py

class StatsView1(LoginRequiredMixin, ListView):
    model = Trade
    template_name = 'dashboard/stats1.html'

    def get_context_data(self, **kwargs):
        filter = StatsFilter1(self.request.GET, queryset=self.get_queryset())
        context = super().get_context_data(**kwargs)
        context['filter'] = filter
        context['get_largest_winning_trade'] = Trade.objects.get_largest_winning_trade
        return context
stats.html(测试)


可能您可以使用属性执行类似的操作:

def get_context_data(self, **kwargs):
    filter = StatsFilter1(self.request.GET, queryset=self.get_queryset())
    context = super().get_context_data(**kwargs)
    context['filter'] = filter
    context['get_largest_winning_trade'] = filter.qs.get_largest_winning_trade
    return context
更新 我想你可以在这里用它来做计算,而不是做it经理。像这样:

from django.db.models import Max
...

context['get_largest_winning_trade'] = filter.qs.aggregate(max_value=Max('profit_loss_value_fees'))['max_value']

使用聚合的原因是为了减少数据库命中率,因为在循环迭代过程中,您的manager方法会多次命中数据库。

有人投了反对票,但从未留下任何评论。。不是很有用谢谢你的潜在答案@ruddra!这只会给我一个错误消息“TradeQuerySet”对象没有属性“get_Maximum_winning_trade”你能分享模型吗?Waaaa我想你解决了它!这一直是我心中的一根刺这么长时间了,明天我将进行更多的统计计算,如果我发现了任何其他有利于这个答案的东西,我将在这里发布。再次感谢!
def get_context_data(self, **kwargs):
    filter = StatsFilter1(self.request.GET, queryset=self.get_queryset())
    context = super().get_context_data(**kwargs)
    context['filter'] = filter
    context['get_largest_winning_trade'] = filter.qs.get_largest_winning_trade
    return context
from django.db.models import Max
...

context['get_largest_winning_trade'] = filter.qs.aggregate(max_value=Max('profit_loss_value_fees'))['max_value']