s(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.
Did you modify your models before sending them out? You don't show any foreign key relationships, but your queries indicate otherwise.
-James
--
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...@googlegroups.com.
To post to this group, send email to django...@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.
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)
categorie = models.ForeignKey("Categorie")
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)
souscategorie = models.ForeignKey('SousCategorie')
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)
theme = models.ForeignKey('Theme')
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--
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...@googlegroups.com.
To post to this group, send email to django...@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/271ec045-3cfc-4de7-8da5-453eca3d692e%40googlegroups.com.
############ template code - I removed the blank lines and reduced the indentation for readability in an email.###########{% for categ in categs %}{% with currscat=categ.souscategorie_set.all %}<li class = "{% if currscat %} has_menu {% endif %}"> {{categ.nom}}{% if currscat %} # This line hit database
That's works really thank you for your time, learned a very good thing today, 1 week im on this X) . Already look a little to Prefetch() function but haven't understand how to use it in my case^^
I have replaced my {% with currscat=categ.getscateg %} by {% with currscat=categ.souscategorie_set.all %} like in your example, that's work "_set.all" return me only "visible" child without more request but i don't understand how that's work, it is supposed to return me all objects, it don't include a filter, Prefetch() function do this?