Projet

Général

Profil

0002-lingo-reduce-queryset-number-38115.patch

Lauréline Guérin, 02 décembre 2019 10:56

Télécharger (3,64 ko)

Voir les différences:

Subject: [PATCH 2/2] lingo: reduce queryset number (#38115)

 combo/apps/lingo/manager_views.py             | 10 +++++++---
 .../templates/lingo/transaction_list.html     | 19 +++++++++++--------
 tests/test_lingo_manager.py                   |  2 +-
 3 files changed, 19 insertions(+), 12 deletions(-)
combo/apps/lingo/manager_views.py
19 19
from dateutil import parser as date_parser
20 20

  
21 21
from django.core.urlresolvers import reverse_lazy
22
from django.db.models import Q
22
from django.db.models import Q, Prefetch
23 23
from django.utils import six
24 24
from django.utils.timezone import make_aware
25 25
from django.views.generic import CreateView, UpdateView, ListView, DeleteView
......
85 85
        return context
86 86

  
87 87
    def get_queryset(self):
88
        qs = Transaction.objects.filter(
89
                status__in=(eopayment.PAID, eopayment.ACCEPTED)).order_by('-start_date')
88
        qs = (
89
            Transaction.objects
90
            .select_related('user')
91
            .prefetch_related(Prefetch('items', to_attr='prefetched_items'))
92
            .filter(status__in=(eopayment.PAID, eopayment.ACCEPTED))
93
            .order_by('-start_date'))
90 94
        query = self.request.GET.get('q')
91 95
        if query:
92 96
            try:
combo/apps/lingo/templates/lingo/transaction_list.html
32 32
</thead>
33 33
<tbody>
34 34
{% for object in object_list %}
35
{% with object.prefetched_items|length|default:1 as nb_items %}
35 36
<tr>
36
 <td rowspan="{{object.items.all.count|default:1}}">{{object.order_id}}</td>
37
 <td rowspan="{{object.items.all.count|default:1}}">{{object.bank_transaction_id}}</td>
38
 <td rowspan="{{object.items.all.count|default:1}}">{{object.start_date}}</td>
39
 <td rowspan="{{object.items.all.count|default:1}}">{{object.get_user_name}}</td>
40
 <td rowspan="{{object.items.all.count|default:1}}">{{object.amount}} €</td>
41
 {% for item in object.items.all %}
37
 <td rowspan="{{ nb_items }}">{{object.order_id}}</td>
38
 <td rowspan="{{ nb_items }}">{{object.bank_transaction_id}}</td>
39
 <td rowspan="{{ nb_items }}">{{object.start_date}}</td>
40
 <td rowspan="{{ nb_items }}">{{object.get_user_name}}</td>
41
 <td rowspan="{{ nb_items }}">{{object.amount}} €</td>
42
 {% for item in object.prefetched_items %}
42 43
 {% if not forloop.first %}<tr>{% endif %}
43 44
  <td style="font-size: smaller">{{item.subject}}</td> <td style="font-size: smaller" class="price">{{item.amount}} €</td></tr>
44
  {% endfor %}
45
  {% if not object.items.all %}</tr>{% endif %}
45
 {% empty %}
46
</tr>
46 47
 {% endfor %}
48
{% endwith %}
49
{% endfor %}
47 50
</tbody>
48 51
</table>
49 52

  
tests/test_lingo_manager.py
216 216
    with CaptureQueriesContext(connection) as ctx:
217 217
        resp = app.get('/manage/lingo/', status=200)
218 218
    assert resp.text.count('<tr') == 11
219
    assert len(ctx.captured_queries) == 74
219
    assert len(ctx.captured_queries) == 5
220 220

  
221 221
    resp.form['q'] = 'order id 16'
222 222
    resp = resp.form.submit()
223
-