Skip to main content
 首页 » 编程设计

python之聚合数据时无法获取 class 'django.db.models.QuerySet' > 的 repr

2025年04月02日54飞鱼

@user_passes_test(lambda u: u.is_staff, login_url='/pyramid/login/') 
def defaulters_report(request): 
    template = 'private/admin/report_defaulters.html' 
    queryset = list(TreeNode.objects.all()) 
    for x in queryset: 
        x.d = x.debt 
    defaulters = TreeNode.objects.filter(id__in=([x.id for x in queryset if x.d > 0])) 
    context = dict() 
    unpaid_purepro = defaulters[0].annuities.all() 
    for x in list(defaulters)[1:]: 
        unpaid_purepro = unpaid_purepro | x.annuities.all() 
    unpaid_purepro = unpaid_purepro.filter(expected_date__lt=timezone.now()) 
    context['total'] = unpaid_purepro.all().aggregate(Sum('total'))['total__sum'] 
    return render(request, template, context) 

当我尝试获取 unpaid_purepro 的值时 - 我收到问题标题中的错误。 View 的最终错误是:

Expression tree is too large (maximum depth 1000) 

我哪里错了?

换句话说:对于每个具有最后 expected_date 的 TreeNode FilterPayment 应该被选择并且 TreeNodes 应该按它们的 payment__expected_date 排序

更新:

模型.py:

class TreeNode(MPTTModel): 
    class Meta: 
        verbose_name = 'участник' 
        verbose_name_plural = 'участники' 
 
    # account for auth 
 
    account = models.OneToOneField(User, verbose_name='аккаунт', related_name='treenode') 
 
    @property 
    def debt(self): 
        ... 
 
    @property 
    def last_payment(self): 
        return self.annuities.last() 
 
    @property 
    def pay_progress(self): 
        return "{}/{}".format(self.annuities.exclude(fact_date=None).aggregate(Sum('total'))['total__sum'], 
                             self.annuities.aggregate(Sum('total'))['total__sum']) 
 
 
class FilterPayment(models.Model): 
    class Meta: 
        verbose_name = 'взнос за фильтр' 
        verbose_name_plural = 'взносы за фильтр' 
 
    expected_date = models.DateField(verbose_name='ожидаемая дата') 
    fact_date = models.DateField(verbose_name='фактическая дата', null=True, blank=True) 
    total = models.IntegerField(verbose_name='сумма') 
    client = models.ForeignKey(TreeNode, related_name='annuities', verbose_name='клиент') 
 
    CASH = 1 
    TERMINAL = 2 
 
    METHOD_CHOICES = ( 
        (CASH, "Cash"), 
        (TERMINAL, "Mobilnik") 
    ) 
    method = models.PositiveSmallIntegerField(choices=METHOD_CHOICES, default=1) 

请您参考如下方法:

你会得到这个错误,因为一些生成的 SQL 查询对于 SQLite 来说太大了。如果您需要 annuities 与 treenodes 的过去 expected_date 以及正 debt 的总和,您可以试试这个:

@user_passes_test(lambda u: u.is_staff, login_url='/pyramid/login/') 
def defaulters_report(request): 
    template = 'private/admin/report_defaulters.html' 
    context = {} 
 
    context['total'] = TreeNode.objects.filter( 
        debt__gt=0, 
        annuities__expected_date__lt=timezone.now() 
    ).aggregate(total=Sum('annuities__total'))['total'] 
 
    return render(request, template, context) 

文档: