Hi,

I got a lot of duplicated queries (in django debug toolbag) when i load my 
menu tabs , actually it's normal because i don't understand how to use 
database optimization for this, if possible i want some advice to make my 
reflexion better on this.

Models(simplify) : 

class Categorie(models.Model):
    nom = models.CharField(max_length=30)
    slug = models.SlugField(max_length=100)
    visible = models.BooleanField("Visible",default = False)

    def getscateg(self):
   
        return self.souscategorie_set.all().filter(visible = True)


class SousCategorie(models.Model):
    nom = models.CharField(max_length=30)
    slug = models.SlugField(max_length=100)
    visible = models.BooleanField("Visible",default = False)
   
    def gettheme(self):
    
        return self.theme_set.all().filter(visible = True)


class Theme(models.Model):
    nom = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100)
    visible = models.BooleanField("Visible",default = False)

    def getstheme(self): # Récupère les thèmes en fonction de la sous-categ 
traité

        return self.soustheme_set.all().filter(visible=True)


class SousTheme(models.Model):
    nom = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100)
    visible = models.BooleanField("Visible",default = False)
      

views : 


def page(request):

    categs = Categorie.objects.filter(visible=True)

    return render(request, 'page.html', locals())

templates (simplify) : 

{% for categ in categs %}
    {% with currscat=categ.getscateg %} 

        <li class = "{% if currscat %} has_menu {% endif %}"> {{categ.nom}}  # 
This line hit database

            {% if currscat %} # This line hit database 

                  <ul class = "menu-1"> 

                   {% for souscateg in currscat %} 
                   {% with currth=souscateg.gettheme %}

                       <li class="{%if currth%} has_menu {%endif%}"> 
{{souscateg.nom}}  #This line hit database


                           {% if currth %} # this line hit database

                              
                               <ul class = "menu-2">

                                   ..........

                               </ul>

                           {% endif %}


</li>
                                            

                   {% endwith %}       
                   {% endfor %}
                  </ul>

            {% endif %}

        </li> 

    {% endwith %}
 {% endfor %}


I think prefetch_related can help me here but i don't find to reduce 
resquest to database with it in this case... So after my template rendered 
i got like 50 request including 40 duplicate...

i have try something like this in my views but without success, that just 
add more request to database  :

categs = 
Categorie.objects.filter(visible=True).prefetch_related('souscategorie_set__theme_set__soustheme_set')

Thanks for your help.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/2cb84db9-34ee-4dee-996d-4199a8eb8773%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to