【问题标题】:Combine filter results in for loop在 for 循环中组合过滤器结果
【发布时间】:2017-12-24 09:11:44
【问题描述】:

我正在使用 Django 创建一个网站。我想组合多个过滤结果(查询集)。

我的模特关系

'员工' 1:m '会员' 1:m 'PaymentHistory' 1:1 'RefundHistory'

我的观点.py:

wanted_refund = set()
for m in staff.members.all():
    payment = m.PaymentHistory.filter(division="Membership")
    for p in payment:
        try:
            refund = RefundHistory.objects.filter(payment=p).filter(refund_date__range=[this_month_start, date])

            wanted_refund.add(refund)
        except RefundHistory.DoesNotExist:
            pass
 context = {
             'wanted_refund' : wanted_refund,}
    return render(request, 'refund.html', context)

但是,使用过滤器不起作用。它只在我使用 'get' 时有效。

print(refund) 显示如下结果:

 < QuerySet [] >

 < QuerySet [] >

 < QuerySet [] >

 < QuerySet [< RefundHistory: RefundHistory object >] >

我只想使用具有对象的查询集,我想要的是模板中的以下查询集:

{% for refund in wanted_history %}
 {{ refund.refund_date }}
 {{ refund.refund_amount}}
 {% endfor %}

如何在 for 循环中传递多个过滤器结果?

【问题讨论】:

  • 您是否希望每次付款都加入该过滤器的结果?例如,在一个查询集中获取每笔付款的退款范围?
  • 我希望每次付款都有现有的 RefundHistory 对象。我编辑了我的帖子。如何在一个查询集中获得结果?

标签: python django


【解决方案1】:

您可以使用管道运算符加入查询集:

wanted_refund = RefundHistory.objects.none()
for m in staff.members.all():
    payment = m.PaymentHistory.filter(division="Membership")
    for p in payment:
        try:
            wanted_refund |= RefundHistory.objects.filter(payment=p).filter(refund_date__range=[this_month_start, date])
        except RefundHistory.DoesNotExist:
            pass
wanted_refund = wanted_refund.distinct()
context = {'wanted_refund': wanted_refund}
return render(request, 'refund.html', context)

另外,如果它适合您,您可以使用 wanted_refund.update(list(refund)) 代替 wanted_refund.add(refund)

【讨论】:

    【解决方案2】:

    使用RefundHistory的单个查询可以获取每个会员每次付款的退款历史记录:

    payments = []
    for m in staff.members.all():
        payments.extend(m.PaymentHistory.filter(division="Membership").values_list('pk', flat=True))
    
    wanted_refund = RefundHistory.objects.filter(payment__pk__in=payments, refund_date__range=[this_month_start, date])
    
    context = {'wanted_refund' : wanted_refund,}
    return render(request, 'refund.html', context)
    

    【讨论】:

    • 谢谢,它有效! '__pk__in' 和 'flat=True' 是什么意思?
    • 好的,__pk 表示我们要匹配付款的pk 字段。 __in 意味着我们想要匹配我们使用payment.values_list('pk', flat=True) 创建的列表中的任何内容。因此,对于使用pk=2 的付款,它可能会检查 2 是否在 [2, 3, 4] 中。现在.values_listflat=True 参数强制列表采用[pk, pk, pk] 的形式,而不是[(pk), (pk), (pk)],因为如果我们提供额外的字段,.values_list 返回一个元组列表。更多示例是here
    • 谢谢!但是,当查询集超过两个时,它只有一个查询集。
    • 您能否详细解释一下您所说的“查询集超过两个”是什么意思?
    • 编辑效果如何?解决方案现在应该附加所有成员 pk,以便我们获得所有成员的结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 2017-03-11
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多