Python 在Django模板中筛选反向查找
我有一个像这样的模型Python 在Django模板中筛选反向查找,python,django,django-views,django-templates,django-queryset,Python,Django,Django Views,Django Templates,Django Queryset,我有一个像这样的模型 class Invoice(models.Model): inv_number = models.CharField(max_length=10, primary_key=True) customer = models.ForeignKey(Customer, on_delete=models.PROTECT) inv_date = models.DateField() class Txn(models.Model): invoice =
class Invoice(models.Model):
inv_number = models.CharField(max_length=10, primary_key=True)
customer = models.ForeignKey(Customer, on_delete=models.PROTECT)
inv_date = models.DateField()
class Txn(models.Model):
invoice = models.ForeignKey(Invoice, on_delete=models.PROTECT)
transaction_date = models.DateField()
reference = models.CharField(max_length=12)
amt = models.IntegerField()
我想在我的模板中显示一个报告,其中列出了过滤后的发票,每个发票都有一个子列表,其中包含过滤后的交易记录
在我看来,我已经做了以下工作:
invoice_list = Invoice.objects.filter(customer=customer)
{% for invoice in invoice_list %}
{{ invoice.inv_number }}, {{ invoice.customer}}, {{ invoice.inv_date }}
{% for txn in invoice.txn_set.all %}
{{ txn.transaction_date }}, {{ txn.reference }}, {{ txn.amt }}
{% endfor %}
{% endfor %}
我将其传递到我的模板中。在模板中,我执行以下操作:
invoice_list = Invoice.objects.filter(customer=customer)
{% for invoice in invoice_list %}
{{ invoice.inv_number }}, {{ invoice.customer}}, {{ invoice.inv_date }}
{% for txn in invoice.txn_set.all %}
{{ txn.transaction_date }}, {{ txn.reference }}, {{ txn.amt }}
{% endfor %}
{% endfor %}
这对于显示每个筛选发票的整个交易列表非常有用。问题是,如何在模板中过滤每个发票的交易列表-如果我只想要特定日期范围内的交易或与特定参考匹配的交易,该怎么办?在将主查询集放入上下文之前,是否有一种方法可以将过滤器传递到视图中每个发票的txn_集合查询集,而不将其转换为列表
谢谢您的回复 建议:在视图中收集发票和交易记录,而不是在模板中 使用此视图代码,您可以将查询量减少到1,因此它比您的代码(使用每个发票的
Txn
表查询)优化得多:
然后在模板中:
{% for elem in invoice_data_list %}
{{ elem.invoice.inv_number }}
{{ elem.invoice.customer}}
{{ elem.invoice.inv_date }}
{% for txn in elem.txn_list %}
{{ txn.transaction_date }}
{{ txn.reference }}
{{ txn.amt }}
{% endfor %}
{% endfor %}
这样做非常有效。非常感谢。