There are a bunch of ways you could approach it, but fundamentally you need
to not call use_editable inside a loop, which is what you've got right now.
Instead you need to somehow call it once per request, have the correct
settings come out, and make those available somehow to every event object
in your loop.

One way to do it would be to add those two settings
to TEMPLATE_ACCESSIBLE_SETTINGS, then change the two methods into template
tags - the template tag function will have access to the template context,
which contains the variable named "settings" containing everything exposed
by TEMPLATE_ACCESSIBLE_SETTINGS after having called use_editable (see
mezzanine.core.context_processors.settings).


On Sat, Sep 6, 2014 at 1:13 AM, Josh Cartmell <[email protected]> wrote:

> I have a site that on some pages iterates over events, creating email and
> facebook share links.  These links are created via models on the method,
> i.e.:
> def facebook_share_url(self):
>     settings.use_editable()
>     request = current_request()
>     host = request.get_host()
>     if self.featured_image:
>         image = '%s%s%s' % (host, settings.MEDIA_URL, self.featured_image)
>     else:
>         image = ''
>     full_path = host + self.get_absolute_url()
>     link = "https://www.facebook.com/dialog/feed?app_id="; +
> settings.FACEBOOK_APP_ID + "&link=http%3A%2F%2F" + full_path +
> "&picture=http%3A%2F%2F" + image + "&name=" + self.title +
> "&redirect_uri=http%3A%2F%2F" + full_path
>     return link
>
> def email_share_url(self):
>     settings.use_editable()
>     request = current_request()
>     host = request.get_host()
>     full_path = host + self.get_absolute_url()
>     site_title = '%s%s' % (settings.SITE_TITLE, ' Calendar')
>     link = "mailto:?subject="; + urllib.quote(site_title) + "%20-%20" +
> self.title + "!&body=http%3A%2F%2F" + full_path
>     return link
>
> Then in the templates there are things like:
> {{ event.email_share_url }}
> {{ event.facebook_share_url }}
>
> Today I noticed that this is extremely inefficient, a page with 3 events
> (each method was called 3 times, I checked to be sure that was the case) on
> it used 547 SQL queries.  Simply removing settings.use_editable() reduced
> the page to 31 queries.
>
> The 547 queries are mostly like:
> *SELECT* ••• <http://127.0.0.1:8000/calendar/month/2014/09/#> *FROM*
> "django_site" *WHERE* "django_site"."domain" *LIKE* '127.0.0.1:8000'
> *ESCAPE* '\'
> *SELECT* ••• <http://127.0.0.1:8000/calendar/month/2014/09/#> *FROM*
> "conf_setting" *INNER JOIN* "conf_setting_sites" *ON*
> ("conf_setting"."id" = "conf_setting_sites"."setting_id") *WHERE*
> "conf_setting_sites"."site_id" = 1
>
> Does anyone have any ideas about how to solve this without removing
> use_editable()?
>
> Thanks!
>
> --
> You received this message because you are subscribed to the Google Groups
> "Mezzanine Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>



-- 
Stephen McDonald
http://jupo.org

-- 
You received this message because you are subscribed to the Google Groups 
"Mezzanine Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to