I post here my real models for better comprehension (and have cleaned it 
this morning with an abstract class)

class Rubrique(models.Model):
    nom = models.CharField(max_length=30)
    slug = models.SlugField(max_length=100)
    page = models.CharField(max_length=50, null=True)
    description = RichTextField(null=True, blank = True)
    metaDesc = models.TextField("Balise meta description",null=True, blank 
= True)
    position = models.PositiveSmallIntegerField("Position",default = 
0,null=True, blank = True)
    visible = models.BooleanField("Visible",default = False)
    redirect = models.CharField("Redirection",max_length=200, null=True, 
blank = True)
    created = models.DateTimeField(_('Date de création'),editable=False)
    modified  = models.DateTimeField(_('Dernière 
modification'),editable=False)
    
    def __str__(self):
        return self.nom
    
    class Meta(object):
        abstract = True
        ordering = ('position',)

class Categorie(Rubrique): 
    develop = models.BooleanField(_('develop?'), default=True, blank=True)
    is_clickable = models.BooleanField(_('clickable?'), default=False, 
blank=True)

    class Meta(Rubrique.Meta):
        pass

    def getscateg(self):
        #return self.souscategorie_set.all().filter(visible = True)
        return SousCategorie.objects.filter(visible = True, categorie = 
self).only('nom','slug','is_clickable','develop')


class SousCategorie(Rubrique):
    
    is_clickable = models.BooleanField(_('clickable?'), default=False, 
blank=True)
    develop = models.BooleanField(_('develop?'), default=False, blank=True)
    categorie = 
models.ForeignKey(Categorie,verbose_name='Catégorie',null=True,on_delete=models.SET_NULL)

    class Meta(Rubrique.Meta):
        pass

    def gettheme(self): 
        return Theme.objects.filter(visible = True, souscategorie = 
self).only('nom','slug','is_clickable')
        #return self.theme_set.all().filter(visible = True)


class Theme(Rubrique):
    is_clickable = models.BooleanField(_('Clickable?'), default=False, 
blank=True)
    souscategorie = 
models.ForeignKey('SousCategorie',verbose_name='Sous-catégorie',null=True,blank=True,on_delete=models.SET_NULL)
    
    class Meta(Rubrique.Meta):
        pass

    def getstheme(self): 
        return SousTheme.objects.filter(visible = True, theme = 
self).only('nom','slug')
        #return self.soustheme_set.all().filter(visible=True)

class SousTheme(Rubrique):
    theme = models.ForeignKey('Theme',verbose_name='Thème', null=True, 
blank = True,on_delete=models.SET_NULL)

    class Meta(Rubrique.Meta):
        pass

Actually it is normal if i have duplicate, because at each "Categorie" loop 
in template i load different data, but if i can optimize this with 1 
request i think will better, i look at cache funcionnality too for visitor 
not have to loads these data at each pages (because this menu is here in 
all pages of the website), but its an other thing.


Le samedi 7 novembre 2015 17:37:17 UTC+1, V1ce a écrit :
>
> 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 [email protected].
To post to this group, send email to [email protected].
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/271ec045-3cfc-4de7-8da5-453eca3d692e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to