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.