0002-lingo-reduce-queryset-number-38115.patch
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 |
- |