Панель инструментов отладки Django говорит, что у меня есть повторяющийся запрос 1367 раз - PullRequest
0 голосов
/ 23 сентября 2018

У меня короткое представление, но со сложным запросом (используемая модель взята из представления MySQL базы данных).Проблема в том, что при выполнении этого представления шаблон загружается слишком медленно.Инструмент отладки Django показывает, что запрос дублируется 1367 раз, но дублированный запрос не имеет ничего общего со сложным запросом представления базы данных.

  1. Есть ли способ избежать дублирования запроса?
  2. Это задержка из-за второго запроса?

Ниже приведен мой шаблон и вид кода.Извините за то, что не показываю их слишком хорошо, но это мой первый пост в StackOverflow.

def simbouloi_list(request, eklid):
    paramorder = request.GET.get('orderoption', '')

    try:
        paramorder = int(paramorder)
    except:
        paramorder = 6  # default ταξινόμηση

    selected_ekloges = Eklogestbl.objects.filter(eklid=eklid)
    # επιλογή όλων των εκλ. αναμετρήσεων με visible=1 και κάνω φθίνουσα ταξινόμηση  αν δεν δοθεί παράμετρος
    all_ekloges = Eklogestbl.objects.filter(visible=1).order_by('-eklid')

    #all_simbouloi = EklallsimbVw.objects.filter(eklid=eklid).order_by('surname', 'firstname', 'fathername')

    if paramorder==1 or paramorder==6:
        all_simbouloi = EklallsimbVw.objects.filter(eklid=eklid).order_by('surname', 'firstname','fathername')
    elif paramorder == 2:
        all_simbouloi = EklallsimbVw.objects.filter(eklid=eklid).order_by('sindiasmos', 'surname', 'firstname','fathername')
    elif paramorder == 3:
        all_simbouloi = EklallsimbVw.objects.filter(eklid=eklid).order_by('sindiasmos', 'toposeklogis', 'surname', 'firstname','fathername')
    elif paramorder == 4:
        all_simbouloi = EklallsimbVw.objects.filter(eklid=eklid).order_by( 'toposeklogis','sindiasmos','surname', 'firstname','fathername')
    else:
        all_simbouloi = EklallsimbVw.objects.filter(eklid=eklid).order_by('toposeklogis', 'surname','firstname', 'fathername')


    context = {'all_ekloges': all_ekloges,
               'selected_ekloges': selected_ekloges,
               'all_simbouloi': all_simbouloi,
               }

    return render(request, 'Elections/simbouloi_list.html' , context)

Шаблон:

{% extends 'Elections/base.html' %}

{% load staticfiles %}

<!-- καλούμε το base.html που προσθέτει το σταθερό Menu -->

 {% block content %}


     {% include 'Elections/messages.html' %}


     <div class="page-header">

            <h3 align="center">Υποψήφιοι Σύμβουλοι (Δημοτικοί & Τοπικοί)</h3>
     </div>

 <div class="row">

       <div class="col-md-10 col-md-offset-1">

                  <form method="get" name="simbouloi">

                     <select   name="orderoption"  onchange="simbouloi.submit()">
                     <option  value="6" {% if selected_order ==  4  %}selected{%endif%}>--------Επιλογή ταξινόμησης--------</option>
                         <option  value="1" {% if selected_order ==  1  %}selected{%endif%}>Κατά Επώνυμο</option>
                         <option  value="2" {% if selected_order ==  2  %}selected{%endif%}>Κατά Συνδυασμό/Επώνυμο</option>
                         <option  value="3" {% if selected_order ==  3  %}selected{%endif%}>Κατά Συνδυασμό/Περ. Εκλογής/Επώνυμο</option>
                         <option  value="4" {% if selected_order ==  3  %}selected{%endif%}>Κατά Περ. Εκλογής/Συνδυασμό/Επώνυμο</option>
                         <option  value="5" {% if selected_order ==  3  %}selected{%endif%}>Κατά Περ. Εκλογής/Επώνυμο</option>

                     </select>
                     <input type="text" class="heighttext" id="livesearch" placeholder="live search"></input>
                  </form>

        <div class="divmargin"> </div>

                    <table>

                        <tbody >

                        <tr class="noborder"> <td colspan="4"><a href="{% url 'simbouloi_add' selected_ekloges.0.eklid%}" class="top-menu"><span class="glyphicon glyphicon-plus"></span> Νέα καταχώριση</a></td></tr>

                        </tbody>
                   </table>

                    <div class="divmargin"> </div>

                   <table class="table styletd1 table-condensed table-striped  table-hover">

                        <tbody >
                        <tr>
                                <td class="thick">Επώνυμο</td>
                                <td class="thick">Όνομα</td>
                                <td class="thick">Όν. Πατρός</td>
                                <td class="thick">Περιοχή Εκλογής</td>
                                <td class="thick">Συνδυασμός</td>
                                <td class="thick">Ενέργειες</td>
                        </tr>
                        {% for p in all_simbouloi %}
                              <tr>
                                <td > {{ p.surname }} </td>
                                <td > {{ p.firstname }}</td>
                                <td > {{ p.fathername }} </td>
                                <td > {{ p.toposeklogis }} </td>
                                <td > {% if  p.sindiasmos is None %} {% else %} {{ p.sindiasmos  }} {% endif %}</td>
                                <td>
                                    <a class="btn btn-default" href="{% url 'simbouloi_edit' selected_ekloges.0.eklid p.simbid%}"><span class="glyphicon glyphicon-pencil"></span></a>
                                    <a class="btn btn-default" href="{% url 'simbouloi_delete' selected_ekloges.0.eklid p.simbid%}"><span class="glyphicon glyphicon-minus"></span></a>
                                </td>

                              </tr>
                          {% endfor %}

                        </tbody>
                   </table>

                    <br/>

                    <table>

                        <tbody >

                        <tr class="noborder"> <td colspan="4"><a href="{% url 'simbouloi_add' selected_ekloges.0.eklid%}" class="top-menu"><span class="glyphicon glyphicon-plus"></span> Νέα καταχώριση</a></td></tr>

                        </tbody>
                   </table>



        </div>
</div>




{% endblock %}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Я не думаю, что смогу использовать команды ниже:

selected_ekloges = all_ekloges.objects.prefetch_related('eklallsimbvw_set').get(eklid=eklid) all_simbouloi = selected_ekloges.eklallsimbvw_set.all()

, потому что "eklallsimbvw" - это модель, которая автоматически создается командой "inspect_db" и описывает Mysql VIEW ине ТАБЛИЦА, поэтому у этой модели нет внешних ключей, связанных с моделью "Eklogestbl" (как я понимаю для команды "prefetch").

Также возникает ошибка типа "Объект QuerySet не имеет атрибутов" objects "'"для первой команды.

Это моя модель EklallsimbVw:

class EklallsimbVw(models.Model):
id = models.IntegerField(primary_key=True)
eklid = models.IntegerField(db_column='eklID',db_index=True)  # Field name made lowercase.
simbid = models.IntegerField(db_column='simbID',db_index=True)  # Field name made lowercase.
surname = models.CharField(db_column='surname', max_length=100,db_index=True)
firstname = models.CharField(db_column='firstname', max_length=100,db_index=True)
fathername = models.CharField(db_column='fathername', max_length=100,db_index=True)
comments = models.CharField(db_column='comments', max_length=100)
toposeklogisid = models.IntegerField(db_column='toposEklogisID')  # Field name made lowercase.
toposeklogis = models.CharField(db_column='toposEklogis', max_length=100)  # Field name made lowercase.
eidoskoinotitas = models.IntegerField(db_column='eidosKoinotitas', blank=True, null=True)  # Field name made lowercase.
sindid = models.IntegerField(db_column='sindID', blank=True, null=True,db_index=True)  # Field name made lowercase.
sindiasmos = models.CharField(db_column='sindiasmos', max_length=100, blank=True, null=True,db_index=True)

Это модель" Eklogestbl ":

class Eklogestbl(models.Model):
eklid = models.AutoField(db_column='eklID', primary_key=True, db_index=True)  # Field name made lowercase.
descr = models.CharField(unique=True, max_length=100)
dateofelection = models.DateField(db_column='dateOfElection', blank=True, null=True)  # Field name made lowercase.
dimos = models.CharField(max_length=100, blank=True)
sisid = models.ForeignKey('Sistima', models.DO_NOTHING, db_column='sisID', db_index=True)  # Field name made lowercase.
edrid = models.ForeignKey(Edres, models.DO_NOTHING, db_column='edrID', db_index=True)  # Field name made lowercase.
visible=models.IntegerField(db_column='visible', default=1)
defaultelection=models.IntegerField(db_column='defaultElection', default=1)
0 голосов
/ 23 сентября 2018

Попробуйте, это хорошая отправная точка для оценки наборов запросов django https://docs.djangoproject.com/en/2.1/ref/models/querysets/

def simbouloi_list(request, eklid):
 paramorder = 6  # default ταξινόμηση
 all_ekloges = Eklogestbl.objects.filter(visible=1).order_by('-eklid')
 if 'orderoption' in request.GET:
    paramorder = int(request.GET.get('orderoption'))

 selected_ekloges = all_ekloges.objects.prefetch_related('eklalallsimbwv_set').get(eklid=eklid) 
 all_simbouloi = selected_ekloges.eklalallsimbwv_set.all()

 if paramorder==1 or paramorder==6:
    all_simbouloi = all_simbouloi.order_by('surname', 'firstname','fathername') # dosen't hit the database
 elif paramorder == 2:
    all_simbouloi = all_simbouloi.order_by('sindiasmos', 'surname', 'firstname','fathername') # dosen't hit the database
 elif paramorder == 3:
    all_simbouloi = all_simbouloi.order_by('sindiasmos', 'toposeklogis', 'surname', 'firstname','fathername') # dosen't hit the database
elif paramorder == 4:
    all_simbouloi = all_simbouloi.order_by( 'toposeklogis','sindiasmos','surname', 'firstname','fathername') # dosen't hit the database
else:
    all_simbouloi = all_simbouloi.order_by('toposeklogis', 'surname','firstname', 'fathername') # dosen't hit the database


context = {'all_ekloges': all_ekloges,
           'selected_ekloges': selected_ekloges,
           'all_simbouloi': all_simbouloi,
           }

return render(request, 'Elections/simbouloi_list.html' , context)

Обновление

Наконец, приведенный ниже код сработал идеально!

selected_ekloges = Eklogestbl.objects.prefetch_related ('eklallsimbvw_set'). get (eklid = eklid)

all_simbouloi = selected_ekloges.eklallsimbvw_set.all().values_list('simbid', 'surname', 'firstname', 'fathername', 'toposeklogis', 'sindiasmos')

if paramorder==1 or paramorder==6:
    all_simbouloi = all_simbouloi.order_by('surname', 'firstname','fathername')
elif paramorder == 2:
    all_simbouloi = all_simbouloi.order_by('sindiasmos', 'surname', 'firstname','fathername')
elif paramorder == 3:
    all_simbouloi = all_simbouloi.order_by('sindiasmos', 'toposeklogis', 'surname', 'firstname','fathername')
elif paramorder == 4:
    all_simbouloi = all_simbouloi.order_by( 'toposeklogis','sindiasmos','surname', 'firstname','fathername')
else:
    all_simbouloi = all_simbouloi.order_by('toposeklogis', 'surname','firstname', 'fathername')

context = {'all_ekloges': all_ekloges,
           'selected_ekloges': selected_ekloges.eklid,
           'all_simbouloi': all_simbouloi,
           }

Большое спасибо!

...