2017-08-17 1 views
0

J'utilise get_absolute_url dans un modèle de sitemap. Pas le sitemap.xml, mais une page dans la mise en page du site affichant tous les liens. En gros, j'obtiens tous les objets de la page, et je les repasse dans le modèle, en utilisant get_absolute_url.Requêtes Django get_absolute_url

J'ai découvert que pour chaque lien, la base de données est frappée une fois. Comment puis-je réduire les requêtes?

Je pensais que deux solutions, mais je ne sais pas quelle est la meilleure façon:

  1. utiliser le cadre de sitemap de Django. Je sais que le framework sitemap utilise aussi get_absolute_url. Je n'ai pas pu vérifier la quantité de requêtes lorsqu'un fichier sitemap.xml est généré (la barre d'outils de débogage n'apparaît pas).
  2. écrire une coutume méthode d'enregistrement, et enregistrer l'URL dans la base de données, en utilisant get_absolute_url

Edit:

J'utilise un code simple pour générer la page de lien:

Views.py:

all_links = mypage.objects.all() 

modèle:

<ul> 
{% for link in all_links %} 
<li>li><a href="{{link.get_absolute_url}}">{{link.link_title}}</a></li> 
{% endfor %} 
</ul> 

models.py:

def get_absolute_url(self): 
     if self.submenu: 
      return "/%s/%s/" %(self.submenu.slug,self.slug) 
     elif not self.mainmenu: 
      return "/submenu/%s" % self.slug 
     else: 
      return "/%s/" % self.slug 

Edit2:

Je changerai le cache quand la production. Je pense que c'est une bonne chose d'optimiser en premier.

+0

Si vous avez un objet de demande, vous pouvez utiliser [this] (https://docs.djangoproject.com/fr/1.11/ref/request- response/# django.http.HttpRequest.build_absolute_uri) Il ne frappera pas votre base de données même une fois –

+0

Je veux une liste de toutes les URL disponibles de mon site. Je ne vois pas comment utiliser un objet de requête pour cela? –

+1

Nous ne pouvons pas vous aider si vous n'affichez pas le code qui génère les requêtes. – Alasdair

Répondre

0

Je pense qu'il est important d'utiliser get_absolute_url, car il ne devrait pas y avoir de différences entre sitemap.xml et ma page sitemap. Ma solution pour maintenant est la suivante (toujours ouvert à de meilleures solutions)

J'ai créé un champ modèle:

absolute_url = models.CharField(max_length=400, blank=True, editable=False) 

Puis une coutume sauver:

def save(self, *args, **kwargs): 
     self.absolute_url = self.get_absolute_url() 
     super(mypage, self).save(*args, **kwargs) 

Dans mon modèle:

<ul> 
    {% for link in all_links %} 
      <li><a href="{{link.absolute_url}}">{{link.menu_title}}</a></li> 
    {% endfor %} 
</ul> 

Cela m'a sauvé beaucoup de questions. Maintenant, un seul est utilisé pour les liens (au lieu de 1 requête par lien)