EDIT MODE

Contents

Introduction
The Set
The Box
The Instructions
The Parts
The Build
Conclusion

Introduction

Follow Din Djarin and Grogu deep inside the depths of the Hutt Palace on Nal Hutta. After seeing Jabba's palace on Tatooine and the horrors inside in the classic trilogy, we know that this is no place you want to be. It seems the Hutts did go with the advance in technology and got some giant sentries instead of the Gamorreans to guard the palace. But it gets worse as the duo also encounters the bounty hunter Embo and his (new) Annoba pet Keibu. How will that work out?

Don't worry about spoilers, I still haven't seen the movie (yet).

The Set

The official description of the set is:

Awesome droid building toy for battle play
Join forces with The Mandalorian and Grogu for an epic Hutt Palace Sentry Droid Showdown (75451) with this LEGO® Star Wars™ building toy for kids. Adjust the hands, arms, legs and feet of the mighty droid and fire its stud shooter. Equip Mando with a jetpack and blaster pistol to fight back. Help Grogu open the back of the droid so he can get inside and deactivate it. Then open the palace gate ready for more close combat against rival bounty hunter Embo, with his bowcaster and hunting partner Keibu.

This brick-built playset offers a great way to relive thrilling scenes from Star Wars: The Mandalorian and Grogu™ and create action-packed new stories. And kids can create with confidence using the LEGO Builder app – zoom, rotate in 3D and track progress with easy-to-follow digital instructions.

A fun birthday or Christmas gift for boys, girls and any fans aged 9 years old and over, the set contains 415 pieces.

ACTION-PACKED BUILDING TOY – Recreate the Hutt Palace Sentry Droid Showdown (75451) with this detailed set based on Star Wars: The Mandalorian and Grogu™ 
4 CHARACTERS FOR PRETEND PLAY – Kids can role-play battle scenarios as they team up with The Mandalorian and Grogu against Embo and his hunting partner Keibu 
POSABLE FIGURE – Move the 3-armed Sentry Droid’s hands, arms, legs and feet, fire its stud shooter and open the back to put Grogu inside to deactivate the droid 
RIVAL BOUNTY HUNTERS – Young fans can recreate scenes or imagine new ones as they open the palace gate and then use Mando’s jetpack and blaster pistol to take on Embo with his bowcaster 
GIFT IDEA FOR KIDS – This brick-built playset makes a cool Star Wars™ gift for boys, girls and any fans aged 9 years old and over 
A HELPING HAND – The LEGO® Builder app guides kids on an intuitive creative adventure where they can track progress, zoom in and rotate sets using 3D instructions, and more 
EXPLORE THE GALAXY – Look out for more collectable sets (sold separately) inspired by Star Wars: The Mandalorian and Grogu™ to relive epic scenes or create original stories 
DIMENSIONS – The Guardian Droid in this 415-piece set stands over 14 cm (5.5 in.) tall

The set is available at the LEGO store for $ 49.99 / € 49,99  / £ 44.99 / AU$ 89.99.

The set contains 415 parts (plus 39 spare parts), and that results in 11.0 ct / 11,0 ct / 9.9 p / 19.8 ct piece, that (sadly) is below average for Star Wars sets. Considerng parts and Minifigs, the price is still too high despite the new mold for Keibu, a new (exclusive) Minifig of Embo and 8 recolors. Din and Grogu got the same Minifigs as in the other set of this wave. This set is not exclusive and there are already discounts around 25 % available.

 

The Box

The box measures 26.2 x 19.1 x 6.1 cm (10⅜" x 7½" x 2⅜"). It contains 4 numbered bags, a flexible cable, one instructions manual and one tiny sticker sheet.

The Instructions

The instruction manual measures 196 mm x 175 mm, has 87 pages and 145 building steps. More is not to say on the manual. Sadly, we get no additional information or pictures of the sentry droid (see one here).

The Parts

The set contains 415 parts and 39 spares, in 18 colors, and 33 part categories, with a total of 196 unique parts/color combinations.

Main colors are:

Main categories are:

The Minifigs


1x Embo, Olive Green

1x Grogu, 7789 Body, Mandalorian Apprentice

1x The Mandalorian / Din Djarin, Dark Brown Outfit with Jet Pack

 

Mando and Grogu are the same Minifigs as in others sets of this wave (see here)

Embo only appeared in one set in 2011 (7930 Bounty Hunter Assault Gunship) despite being a really fun and iconic character from the Clone Wars series. While often being on the side of the villains, he also fights alongside the heroes in some adventures in the Clone Wars series and shows his incredible skills. The Minifig got a new design based on The Mandalorian & Grogu movie. The Minifig is fantastic with his special hat, that he can also use as shield and throwing weapon or even to slide on it to escape or chase someone. The only thing I would criticize on this Minifig is that it has Embo's iconic fighting skirt only printed and not as a cloth piece (e.g., like the Monster Hunter from CMF series 29 or, even better, like Chirrut Imwe).

The new Annobi mold is much bigger than I expected. Compared to the wolf from the Wolfpack Beastmaster, its size really shows. The mane and tip of the tail are great features and are made from a rubber material that has a nice contrast to the rest of the body. I think this mold is great for a big, mean alpha male of a (actual) wolfpack or companion of a Wolfpack leader or DnD character.

New Parts

New Colors

New Prints

Rare Colors and Prints

 

The set has 39 spare parts with a few interesting parts but no prints:

The Build

The build itself is straightforward. The small gate is a simple build that has a hinted rock structure and is finished after only a couple steps. The droid itself, which is called ARGES by the way, follows established ways of other mechs like from Ninjago (This is the way!). The body uses a lot of SNOT to have connection points for the outer layer. New is the head that actually sits between the shoulders and needs to be built in. It still sits on a technic pin and has a tiny bit of room for movement between the brackets.

The front and back of the droid are separate sections with many tiles and curved slopes. A flexible cable connects the two and should resemble a belt alongside a sticker on top of the right shoulder. The third hand is a bit weird (but accurate) feature. Arms and legs use the angled plate, which makes them look bent but doesn't allow any movement of elbow and knee. The knees are broadened with perfectly placed round plates and round bricks atop the middle section of the angled plate. Thanks to many brackets, we can add a lot of details on arms and legs.

 

Conclusion

The overall look of the droid is quite good. It reminds me of Boba Fett because of the dark red and dark green colors, but I think there is no actual connection. Compared to behind-the-scenes picture of the actual life-sized models of the droid (the scenes with it are filmed in stop motion), the colors are way too bright as the original has very dull colors and a more dusty look.

Besides the movements of the droid, it has two play features. When you remove the back, it reveals a small compartment Grogu fits in and maybe he can meddle with the droid from there or shut it down. The left arm has a hinge brick that allows placing a Minifig on the arm, probably for fighting scenes.

Overall, the set is underwhelming in my eyes. The mech doesn't really stand out against the other Star Wars mechs that come for $ 15. Yes, it is a little bit bigger, but other than that... It doesn't seem fully worked out and is a bit careless with the rugged details and too bright colors. One might also ask, why the second droid of this scene isn't included in the set. All of that leaves me with the impression that this set is just about the Embo Minifig and the Keibu mold as the sales angle, and the rest is just there to add some parts. But to be fair, we have to consider that this is meant as a playset for 9+ kids, and therefore the accuracy probably isn't that important. Yet, the inclusion of Embo is a strong hint that this set also covertly addresses adults, especially Minifig collectors (Embo and Keibu together go for 37 € to 40 € on Bricklick).

Back to Top

Disclaimer: Anything said in this post is the opinion of the author and not the designer.
Parts- and build photographs by Chricki (© 2026 Rebrickable)

RebrickMat - LEGO Building Mat

In this review:

Hutt Palace Sentry Droid Showdown
75451-1
(415 parts)
Star Wars 2026
10318 Concorde
DJDT

Time

Resource usage

Resource Value
User CPU time 237.952 msec
System CPU time 7.147 msec
Total CPU time 245.099 msec
Elapsed time 1326.273 msec
Context switches 292 voluntary, 5 involuntary

Browser timing

Timing attribute Timeline Milliseconds since navigation start (+length)

SQL queries from 1 connection

  • default 1068.12 ms (50 queries including 35 similar and 10 duplicates )
Query Timeline Time (ms) Action
SELECT "blog_article"."id",
       "blog_article"."title",
       "blog_article"."author_id",
       "blog_article"."published_date",
       "blog_article"."is_active",
       "blog_article"."body",
       "blog_article"."meta_description",
       "blog_article"."meta_img",
       "blog_article"."slug",
       "blog_article"."category_id",
       "blog_article"."ads",
       "blog_article"."show_ads_for_set_num",
       "blog_article"."review_for_set_num",
       "blog_article"."status",
       "blog_article"."scheduled_net",
       "blog_article"."ready_for_review_date",
       "blog_article"."is_sensitive",
       "blog_article"."search_vector"
  FROM
"blog_article"
 WHERE
("blog_article"."is_active" AND "blog_article"."id" = 976)
 LIMIT
21
SELECT ••• FROM "blog_article" WHERE ("blog_article"."is_active" AND "blog_article"."id" = 976) LIMIT 21
9 similar queries.
0.42

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(119)
  article = get_object_or_404(Article, id=article_id)

SELECT "blog_article"."id",
       "blog_article"."title",
       "blog_article"."author_id",
       "blog_article"."published_date",
       "blog_article"."is_active",
       "blog_article"."body",
       "blog_article"."meta_description",
       "blog_article"."meta_img",
       "blog_article"."slug",
       "blog_article"."category_id",
       "blog_article"."ads",
       "blog_article"."show_ads_for_set_num",
       "blog_article"."review_for_set_num",
       "blog_article"."status",
       "blog_article"."scheduled_net",
       "blog_article"."ready_for_review_date",
       "blog_article"."is_sensitive",
       "blog_article"."search_vector",
       (SIMILARITY("blog_article"."title", 'Review: 75451-1 Hutt Palace Sentry Droid Showdown') + SIMILARITY("blog_article"."body", 'Contents IntroductionThe SetThe BoxThe Instructions The PartsThe BuildConclusion Introduction Follow Din Djarin and Grogu deep inside the depths of the Hutt Palace on Nal Hutta. After seeing Jabba''s palace on Tatooine and the horrors inside in the classic trilogy, we know that this is no place you want to be. It seems the Hutts did go with the advance in technology and got some giant sentries instead of the Gamorreans to guard the palace. But it gets worse as the duo also encounters the bounty hunter Embo and his (new) Annoba pet Keibu. How will that work out? Don''t worry about spoilers, I still haven''t seen the movie (yet). The Set The official description of the set is: Awesome droid building toy for battle playJoin forces with The Mandalorian and Grogu for an epic Hutt Palace Sentry Droid Showdown (75451) with this LEGO® Star Wars™ building toy for kids. Adjust the hands, arms, legs and feet of the mighty droid and fire its stud shooter. Equip Mando with a jetpack and blaster pistol to fight back. Help Grogu open the back of the droid so he can get inside and deactivate it. Then open the palace gate ready for more close combat against rival bounty hunter Embo, with his bowcaster and hunting partner Keibu. This brick-built playset offers a great way to relive thrilling scenes from Star Wars: The Mandalorian and Grogu™ and create action-packed new stories. And kids can create with confidence using the LEGO Builder app – zoom, rotate in 3D and track progress with easy-to-follow digital instructions. A fun birthday or Christmas gift for boys, girls and any fans aged 9 years old and over, the set contains 415 pieces. ACTION-PACKED BUILDING TOY – Recreate the Hutt Palace Sentry Droid Showdown (75451) with this detailed set based on Star Wars: The Mandalorian and Grogu™ 4 CHARACTERS FOR PRETEND PLAY – Kids can role-play battle scenarios as they team up with The Mandalorian and Grogu against Embo and his hunting partner Keibu POSABLE FIGURE – Move the 3-armed Sentry Droid’s hands, arms, legs and feet, fire its stud shooter and open the back to put Grogu inside to deactivate the droid RIVAL BOUNTY HUNTERS – Young fans can recreate scenes or imagine new ones as they open the palace gate and then use Mando’s jetpack and blaster pistol to take on Embo with his bowcaster GIFT IDEA FOR KIDS – This brick-built playset makes a cool Star Wars™ gift for boys, girls and any fans aged 9 years old and over A HELPING HAND – The LEGO® Builder app guides kids on an intuitive creative adventure where they can track progress, zoom in and rotate sets using 3D instructions, and more EXPLORE THE GALAXY – Look out for more collectable sets (sold separately) inspired by Star Wars: The Mandalorian and Grogu™ to relive epic scenes or create original stories DIMENSIONS – The Guardian Droid in this 415-piece set stands over 14 cm (5.5 in.) tall The set is available at the LEGO store for $ 49.99 / € 49,99  / £ 44.99 / AU$ 89.99. The set contains 415 parts (plus 39 spare parts), and that results in 11.0 ct / 11,0 ct / 9.9 p / 19.8 ct piece, that (sadly) is below average for Star Wars sets. Considerng parts and Minifigs, the price is still too high despite the new mold for Keibu, a new (exclusive) Minifig of Embo and 8 recolors. Din and Grogu got the same Minifigs as in the other set of this wave. This set is not exclusive and there are already discounts around 25 % available.   The Box The box measures 26.2 x 19.1 x 6.1 cm (10⅜" x 7½" x 2⅜"). It contains 4 numbered bags, a flexible cable, one instructions manual and one tiny sticker sheet. The Instructions The instruction manual measures 196 mm x 175 mm, has 87 pages and 145 building steps. More is not to say on the manual. Sadly, we get no additional information or pictures of the sentry droid (see one here). The Parts The set contains 415 parts and 39 spares, in 18 colors, and 33 part categories, with a total of 196 unique parts/color combinations.Main colors are: Dark Bluish Gray: 66 unique parts, 155 quantity. Light Bluish Gray: 32 unique parts, 73 quantity. Dark Tan: 18 unique parts, 40 quantity. Main categories are: Plates Special: 42 unique parts, 97 quantity. Plates: 24 unique parts, 66 quantity. Bricks Curved: 14 unique parts, 27 quantity. The Minifigs 1x Embo, Olive Green 1x Grogu, 7789 Body, Mandalorian Apprentice 1x The Mandalorian / Din Djarin, Dark Brown Outfit with Jet Pack   Mando and Grogu are the same Minifigs as in others sets of this wave (see here) Embo only appeared in one set in 2011 (7930 Bounty Hunter Assault Gunship) despite being a really fun and iconic character from the Clone Wars series. While often being on the side of the villains, he also fights alongside the heroes in some adventures in the Clone Wars series and shows his incredible skills. The Minifig got a new design based on The Mandalorian & Grogu movie. The Minifig is fantastic with his special hat, that he can also use as shield and throwing weapon or even to slide on it to escape or chase someone. The only thing I would criticize on this Minifig is that it has Embo''s iconic fighting skirt only printed and not as a cloth piece (e.g., like the ')) AS "similarity",
       "auth_user"."id",
       "auth_user"."password",
       "auth_user"."last_login",
       "auth_user"."is_superuser",
       "auth_user"."username",
       "auth_user"."first_name",
       "auth_user"."last_name",
       "auth_user"."email",
       "auth_user"."is_staff",
       "auth_user"."is_active",
       "auth_user"."date_joined"
  FROM
"blog_article"
  LEFT OUTER JOIN
"auth_user"
    ON
("blog_article"."author_id" = "auth_user"."id")
 WHERE
("blog_article"."is_active" AND "blog_article"."published_date" > '2023-11-16T23:51:07.565276+00:00'::timestamptz AND NOT ("blog_article"."id" = 976))
 ORDER BY
19 DESC, "blog_article"."published_date" DESC
 LIMIT
20
SELECT "blog_article"."id", "blog_article"."title", "blog_article"."author_id", "blog_article"."published_date", "blog_article"."is_active", "blog_article"."body", "blog_article"."meta_description", "blog_article"."meta_img", "blog_article"."slug", "blog_article"."category_id", "blog_article"."ads", "blog_article"."show_ads_for_set_num", "blog_article"."review_for_set_num", "blog_article"."status", "blog_article"."scheduled_net", "blog_article"."ready_for_review_date", "blog_article"."is_sensitive", "blog_article"."search_vector", (SIMILARITY("blog_article"."title", 'Review: 75451-1 Hutt Palace Sentry Droid Showdown') + SIMILARITY("blog_article"."body", 'Contents IntroductionThe SetThe BoxThe Instructions The PartsThe BuildConclusion Introduction Follow Din Djarin and Grogu deep inside the depths of the Hutt Palace on Nal Hutta. After seeing Jabba''s palace on Tatooine and the horrors inside in the classic trilogy, we know that this is no place you want to be. It seems the Hutts did go with the advance in technology and got some giant sentries instead of the Gamorreans to guard the palace. But it gets worse as the duo also encounters the bounty hunter Embo and his (new) Annoba pet Keibu. How will that work out? Don''t worry about spoilers, I still haven''t seen the movie (yet). The Set The official description of the set is: Awesome droid building toy for battle playJoin forces with The Mandalorian and Grogu for an epic Hutt Palace Sentry Droid Showdown (75451) with this LEGO® Star Wars™ building toy for kids. Adjust the hands, arms, legs and feet of the mighty droid and fire its stud shooter. Equip Mando with a jetpack and blaster pistol to fight back. Help Grogu open the back of the droid so he can get inside and deactivate it. Then open the palace gate ready for more close combat against rival bounty hunter Embo, with his bowcaster and hunting partner Keibu. This brick-built playset offers a great way to relive thrilling scenes from Star Wars: The Mandalorian and Grogu™ and create action-packed new stories. And kids can create with confidence using the LEGO Builder app – zoom, rotate in 3D and track progress with easy-to-follow digital instructions. A fun birthday or Christmas gift for boys, girls and any fans aged 9 years old and over, the set contains 415 pieces. ACTION-PACKED BUILDING TOY – Recreate the Hutt Palace Sentry Droid Showdown (75451) with this detailed set based on Star Wars: The Mandalorian and Grogu™ 4 CHARACTERS FOR PRETEND PLAY – Kids can role-play battle scenarios as they team up with The Mandalorian and Grogu against Embo and his hunting partner Keibu POSABLE FIGURE – Move the 3-armed Sentry Droid’s hands, arms, legs and feet, fire its stud shooter and open the back to put Grogu inside to deactivate the droid RIVAL BOUNTY HUNTERS – Young fans can recreate scenes or imagine new ones as they open the palace gate and then use Mando’s jetpack and blaster pistol to take on Embo with his bowcaster GIFT IDEA FOR KIDS – This brick-built playset makes a cool Star Wars™ gift for boys, girls and any fans aged 9 years old and over A HELPING HAND – The LEGO® Builder app guides kids on an intuitive creative adventure where they can track progress, zoom in and rotate sets using 3D instructions, and more EXPLORE THE GALAXY – Look out for more collectable sets (sold separately) inspired by Star Wars: The Mandalorian and Grogu™ to relive epic scenes or create original stories DIMENSIONS – The Guardian Droid in this 415-piece set stands over 14 cm (5.5 in.) tall The set is available at the LEGO store for $ 49.99 / € 49,99  / £ 44.99 / AU$ 89.99. The set contains 415 parts (plus 39 spare parts), and that results in 11.0 ct / 11,0 ct / 9.9 p / 19.8 ct piece, that (sadly) is below average for Star Wars sets. Considerng parts and Minifigs, the price is still too high despite the new mold for Keibu, a new (exclusive) Minifig of Embo and 8 recolors. Din and Grogu got the same Minifigs as in the other set of this wave. This set is not exclusive and there are already discounts around 25 % available.   The Box The box measures 26.2 x 19.1 x 6.1 cm (10⅜" x 7½" x 2⅜"). It contains 4 numbered bags, a flexible cable, one instructions manual and one tiny sticker sheet. The Instructions The instruction manual measures 196 mm x 175 mm, has 87 pages and 145 building steps. More is not to say on the manual. Sadly, we get no additional information or pictures of the sentry droid (see one here). The Parts The set contains 415 parts and 39 spares, in 18 colors, and 33 part categories, with a total of 196 unique parts/color combinations.Main colors are: Dark Bluish Gray: 66 unique parts, 155 quantity. Light Bluish Gray: 32 unique parts, 73 quantity. Dark Tan: 18 unique parts, 40 quantity. Main categories are: Plates Special: 42 unique parts, 97 quantity. Plates: 24 unique parts, 66 quantity. Bricks Curved: 14 unique parts, 27 quantity. The Minifigs 1x Embo, Olive Green 1x Grogu, 7789 Body, Mandalorian Apprentice 1x The Mandalorian / Din Djarin, Dark Brown Outfit with Jet Pack   Mando and Grogu are the same Minifigs as in others sets of this wave (see here) Embo only appeared in one set in 2011 (7930 Bounty Hunter Assault Gunship) despite being a really fun and iconic character from the Clone Wars series. While often being on the side of the villains, he also fights alongside the heroes in some adventures in the Clone Wars series and shows his incredible skills. The Minifig got a new design based on The Mandalorian & Grogu movie. The Minifig is fantastic with his special hat, that he can also use as shield and throwing weapon or even to slide on it to escape or chase someone. The only thing I would criticize on this Minifig is that it has Embo''s iconic fighting skirt only printed and not as a cloth piece (e.g., like the ')) AS "similarity", "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "blog_article" LEFT OUTER JOIN "auth_user" ON ("blog_article"."author_id" = "auth_user"."id") WHERE ("blog_article"."is_active" AND "blog_article"."published_date" > '2023-11-16T23:51:07.565276+00:00'::timestamptz AND NOT ("blog_article"."id" = 976)) ORDER BY 19 DESC, "blog_article"."published_date" DESC LIMIT 20
935.38

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(148)
  related_articles = article.get_related_articles(num_sidebar_posts)

/home/nathan/rb/site/./cache/utils.py in cache_wrapper(98)
  result = method(instance, *args, **kwargs)

/home/nathan/rb/site/./blog/models.py in get_related_articles(289)
  return list(Article.objects.select_related('author').filter(published_date__gt=timezone.now()-timedelta(days=365*3)).annotate(similarity=TrigramSimilarity('title', self.title)+TrigramSimilarity('body', body)).exclude(id=self.id).order_by('-similarity', '-published_date')[:num])

SELECT "blog_article"."id",
       "blog_article"."title",
       "blog_article"."author_id",
       "blog_article"."published_date",
       "blog_article"."is_active",
       "blog_article"."body",
       "blog_article"."meta_description",
       "blog_article"."meta_img",
       "blog_article"."slug",
       "blog_article"."category_id",
       "blog_article"."ads",
       "blog_article"."show_ads_for_set_num",
       "blog_article"."review_for_set_num",
       "blog_article"."status",
       "blog_article"."scheduled_net",
       "blog_article"."ready_for_review_date",
       "blog_article"."is_sensitive",
       "blog_article"."search_vector",
       "auth_user"."id",
       "auth_user"."password",
       "auth_user"."last_login",
       "auth_user"."is_superuser",
       "auth_user"."username",
       "auth_user"."first_name",
       "auth_user"."last_name",
       "auth_user"."email",
       "auth_user"."is_staff",
       "auth_user"."is_active",
       "auth_user"."date_joined"
  FROM
"blog_article"
  LEFT OUTER JOIN
"auth_user"
    ON
("blog_article"."author_id" = "auth_user"."id")
  LEFT OUTER JOIN
"blog_articlestats"
    ON
("blog_article"."id" = "blog_articlestats"."article_id")
 WHERE
("blog_article"."is_active" AND "blog_article"."published_date" > '2025-11-15T23:51:08.515633+00:00'::timestamptz)
 ORDER BY
"blog_articlestats"."hits" DESC
 LIMIT
20
SELECT ••• FROM "blog_article" LEFT OUTER JOIN "auth_user" ON ("blog_article"."author_id" = "auth_user"."id") LEFT OUTER JOIN "blog_articlestats" ON ("blog_article"."id" = "blog_articlestats"."article_id") WHERE ("blog_article"."is_active" AND "blog_article"."published_date" > '2025-11-15T23:51:08.515633+00:00'::timestamptz) ORDER BY "blog_articlestats"."hits" DESC LIMIT 20
3.33

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(149)
  popular_articles = Article.get_popular_articles(num_sidebar_posts)

/home/nathan/rb/site/./cache/utils.py in cache_wrapper(101)
  caches[cache_key].set(method_key, result, seconds)

/home/nathan/venv_rb310/lib/python3.10/site-packages/pymemcache/client/hash.py in set(344)
  return self._run_cmd("set", key, False, *args, **kwargs)

/home/nathan/venv_rb310/lib/python3.10/site-packages/pymemcache/client/hash.py in _run_cmd(322)
  return self._safely_run_func(client, func, default_val, *args, **kwargs)

/home/nathan/venv_rb310/lib/python3.10/site-packages/pymemcache/client/hash.py in _safely_run_func(211)
  result = func(*args, **kwargs)

/home/nathan/venv_rb310/lib/python3.10/site-packages/pymemcache/client/base.py in set(1424)
  return client.set(key, value, expire=expire, noreply=noreply, flags=flags)

/home/nathan/venv_rb310/lib/python3.10/site-packages/pymemcache/client/base.py in set(475)
  return self._store_cmd(b"set", {key: value}, expire, noreply, flags=flags)[key]

/home/nathan/venv_rb310/lib/python3.10/site-packages/pymemcache/client/base.py in _store_cmd(1196)
  data, data_flags = self.serde.serialize(key, data)

/home/nathan/venv_rb310/lib/python3.10/site-packages/pymemcache/serde.py in serialize(119)
  return self._serialize_func(key, value)

/home/nathan/venv_rb310/lib/python3.10/site-packages/pymemcache/serde.py in _python_memcache_serializer(58)
  pickler.dump(value)

SELECT "blog_article"."id",
       "blog_article"."title",
       "blog_article"."author_id",
       "blog_article"."published_date",
       "blog_article"."is_active",
       "blog_article"."body",
       "blog_article"."meta_description",
       "blog_article"."meta_img",
       "blog_article"."slug",
       "blog_article"."category_id",
       "blog_article"."ads",
       "blog_article"."show_ads_for_set_num",
       "blog_article"."review_for_set_num",
       "blog_article"."status",
       "blog_article"."scheduled_net",
       "blog_article"."ready_for_review_date",
       "blog_article"."is_sensitive",
       "blog_article"."search_vector"
  FROM
"blog_article"
 WHERE
("blog_article"."is_active" AND "blog_article"."id" = 646)
 LIMIT
21
SELECT ••• FROM "blog_article" WHERE ("blog_article"."is_active" AND "blog_article"."id" = 646) LIMIT 21
9 similar queries.
0.18

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(50)
  {'name': 'Designer Spotlights', 'tag': 'designer-spotlight', 'article': Article.objects.get(id=646)},

SELECT "blog_article"."id",
       "blog_article"."title",
       "blog_article"."author_id",
       "blog_article"."published_date",
       "blog_article"."is_active",
       "blog_article"."body",
       "blog_article"."meta_description",
       "blog_article"."meta_img",
       "blog_article"."slug",
       "blog_article"."category_id",
       "blog_article"."ads",
       "blog_article"."show_ads_for_set_num",
       "blog_article"."review_for_set_num",
       "blog_article"."status",
       "blog_article"."scheduled_net",
       "blog_article"."ready_for_review_date",
       "blog_article"."is_sensitive",
       "blog_article"."search_vector"
  FROM
"blog_article"
 WHERE
("blog_article"."is_active" AND "blog_article"."id" = 720)
 LIMIT
21
SELECT ••• FROM "blog_article" WHERE ("blog_article"."is_active" AND "blog_article"."id" = 720) LIMIT 21
9 similar queries.
0.28

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(51)
  {'name': 'New Set Releases', 'tag': 'sets', 'article': Article.objects.get(id=720)},

SELECT "blog_article"."id",
       "blog_article"."title",
       "blog_article"."author_id",
       "blog_article"."published_date",
       "blog_article"."is_active",
       "blog_article"."body",
       "blog_article"."meta_description",
       "blog_article"."meta_img",
       "blog_article"."slug",
       "blog_article"."category_id",
       "blog_article"."ads",
       "blog_article"."show_ads_for_set_num",
       "blog_article"."review_for_set_num",
       "blog_article"."status",
       "blog_article"."scheduled_net",
       "blog_article"."ready_for_review_date",
       "blog_article"."is_sensitive",
       "blog_article"."search_vector"
  FROM
"blog_article"
 WHERE
("blog_article"."is_active" AND "blog_article"."id" = 605)
 LIMIT
21
SELECT ••• FROM "blog_article" WHERE ("blog_article"."is_active" AND "blog_article"."id" = 605) LIMIT 21
9 similar queries.
0.18

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(52)
  {'name': 'Into the Archives', 'tag': 'into-the-archives', 'article': Article.objects.get(id=605)},

SELECT "blog_article"."id",
       "blog_article"."title",
       "blog_article"."author_id",
       "blog_article"."published_date",
       "blog_article"."is_active",
       "blog_article"."body",
       "blog_article"."meta_description",
       "blog_article"."meta_img",
       "blog_article"."slug",
       "blog_article"."category_id",
       "blog_article"."ads",
       "blog_article"."show_ads_for_set_num",
       "blog_article"."review_for_set_num",
       "blog_article"."status",
       "blog_article"."scheduled_net",
       "blog_article"."ready_for_review_date",
       "blog_article"."is_sensitive",
       "blog_article"."search_vector"
  FROM
"blog_article"
 WHERE
("blog_article"."is_active" AND "blog_article"."id" = 705)
 LIMIT
21
SELECT ••• FROM "blog_article" WHERE ("blog_article"."is_active" AND "blog_article"."id" = 705) LIMIT 21
9 similar queries.
0.25

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(53)
  {'name': 'Mini MOC Madness', 'tag': 'mini-moc-madness', 'article': Article.objects.get(id=705)},

SELECT "blog_article"."id",
       "blog_article"."title",
       "blog_article"."author_id",
       "blog_article"."published_date",
       "blog_article"."is_active",
       "blog_article"."body",
       "blog_article"."meta_description",
       "blog_article"."meta_img",
       "blog_article"."slug",
       "blog_article"."category_id",
       "blog_article"."ads",
       "blog_article"."show_ads_for_set_num",
       "blog_article"."review_for_set_num",
       "blog_article"."status",
       "blog_article"."scheduled_net",
       "blog_article"."ready_for_review_date",
       "blog_article"."is_sensitive",
       "blog_article"."search_vector"
  FROM
"blog_article"
 WHERE
("blog_article"."is_active" AND "blog_article"."id" = 616)
 LIMIT
21
SELECT ••• FROM "blog_article" WHERE ("blog_article"."is_active" AND "blog_article"."id" = 616) LIMIT 21
9 similar queries.
0.20

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(54)
  {'name': 'Is This LEGO?', 'tag': 'is-this-lego', 'article': Article.objects.get(id=616)},

SELECT "blog_article"."id",
       "blog_article"."title",
       "blog_article"."author_id",
       "blog_article"."published_date",
       "blog_article"."is_active",
       "blog_article"."body",
       "blog_article"."meta_description",
       "blog_article"."meta_img",
       "blog_article"."slug",
       "blog_article"."category_id",
       "blog_article"."ads",
       "blog_article"."show_ads_for_set_num",
       "blog_article"."review_for_set_num",
       "blog_article"."status",
       "blog_article"."scheduled_net",
       "blog_article"."ready_for_review_date",
       "blog_article"."is_sensitive",
       "blog_article"."search_vector"
  FROM
"blog_article"
 WHERE
("blog_article"."is_active" AND "blog_article"."id" = 462)
 LIMIT
21
SELECT ••• FROM "blog_article" WHERE ("blog_article"."is_active" AND "blog_article"."id" = 462) LIMIT 21
9 similar queries.
0.20

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(55)
  {'name': 'Tips & Useful Info', 'tag': 'tips', 'article': Article.objects.get(id=462)},

SELECT "blog_article"."id",
       "blog_article"."title",
       "blog_article"."author_id",
       "blog_article"."published_date",
       "blog_article"."is_active",
       "blog_article"."body",
       "blog_article"."meta_description",
       "blog_article"."meta_img",
       "blog_article"."slug",
       "blog_article"."category_id",
       "blog_article"."ads",
       "blog_article"."show_ads_for_set_num",
       "blog_article"."review_for_set_num",
       "blog_article"."status",
       "blog_article"."scheduled_net",
       "blog_article"."ready_for_review_date",
       "blog_article"."is_sensitive",
       "blog_article"."search_vector"
  FROM
"blog_article"
 WHERE
("blog_article"."is_active" AND "blog_article"."id" = 279)
 LIMIT
21
SELECT ••• FROM "blog_article" WHERE ("blog_article"."is_active" AND "blog_article"."id" = 279) LIMIT 21
9 similar queries.
0.16

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(56)
  {'name': 'Rebricksberg', 'tag': 'rebricksberg', 'article': Article.objects.get(id=279)},

SELECT "blog_article"."id",
       "blog_article"."title",
       "blog_article"."author_id",
       "blog_article"."published_date",
       "blog_article"."is_active",
       "blog_article"."body",
       "blog_article"."meta_description",
       "blog_article"."meta_img",
       "blog_article"."slug",
       "blog_article"."category_id",
       "blog_article"."ads",
       "blog_article"."show_ads_for_set_num",
       "blog_article"."review_for_set_num",
       "blog_article"."status",
       "blog_article"."scheduled_net",
       "blog_article"."ready_for_review_date",
       "blog_article"."is_sensitive",
       "blog_article"."search_vector"
  FROM
"blog_article"
 WHERE
("blog_article"."is_active" AND "blog_article"."id" = 249)
 LIMIT
21
SELECT ••• FROM "blog_article" WHERE ("blog_article"."is_active" AND "blog_article"."id" = 249) LIMIT 21
9 similar queries.
0.13

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(57)
  {'name': 'The Good, The Bad, & The Ugly', 'tag': 'good-bad-ugly', 'article': Article.objects.get(id=249)},

SELECT COUNT(*) AS "__count"
  FROM
"blog_article"
 INNER JOIN
"taggit_taggeditem"
    ON
("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12))
 INNER JOIN
"taggit_tag"
    ON
("taggit_taggeditem"."tag_id" = "taggit_tag"."id")
 WHERE
("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('designer-spotlight'))
SELECT ••• FROM "blog_article" INNER JOIN "taggit_taggeditem" ON ("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12)) INNER JOIN "taggit_tag" ON ("taggit_taggeditem"."tag_id" = "taggit_tag"."id") WHERE ("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('designer-spotlight'))
8 similar queries.
2.44

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(60)
  s['num_posts'] = Article.objects.filter(tags__slug__iexact=s['tag']).count()

SELECT COUNT(*) AS "__count"
  FROM
"blog_article"
 INNER JOIN
"taggit_taggeditem"
    ON
("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12))
 INNER JOIN
"taggit_tag"
    ON
("taggit_taggeditem"."tag_id" = "taggit_tag"."id")
 WHERE
("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('sets'))
SELECT ••• FROM "blog_article" INNER JOIN "taggit_taggeditem" ON ("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12)) INNER JOIN "taggit_tag" ON ("taggit_taggeditem"."tag_id" = "taggit_tag"."id") WHERE ("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('sets'))
8 similar queries.
2.16

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(60)
  s['num_posts'] = Article.objects.filter(tags__slug__iexact=s['tag']).count()

SELECT COUNT(*) AS "__count"
  FROM
"blog_article"
 INNER JOIN
"taggit_taggeditem"
    ON
("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12))
 INNER JOIN
"taggit_tag"
    ON
("taggit_taggeditem"."tag_id" = "taggit_tag"."id")
 WHERE
("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('into-the-archives'))
SELECT ••• FROM "blog_article" INNER JOIN "taggit_taggeditem" ON ("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12)) INNER JOIN "taggit_tag" ON ("taggit_taggeditem"."tag_id" = "taggit_tag"."id") WHERE ("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('into-the-archives'))
8 similar queries.
2.16

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(60)
  s['num_posts'] = Article.objects.filter(tags__slug__iexact=s['tag']).count()

SELECT COUNT(*) AS "__count"
  FROM
"blog_article"
 INNER JOIN
"taggit_taggeditem"
    ON
("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12))
 INNER JOIN
"taggit_tag"
    ON
("taggit_taggeditem"."tag_id" = "taggit_tag"."id")
 WHERE
("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('mini-moc-madness'))
SELECT ••• FROM "blog_article" INNER JOIN "taggit_taggeditem" ON ("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12)) INNER JOIN "taggit_tag" ON ("taggit_taggeditem"."tag_id" = "taggit_tag"."id") WHERE ("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('mini-moc-madness'))
8 similar queries.
2.25

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(60)
  s['num_posts'] = Article.objects.filter(tags__slug__iexact=s['tag']).count()

SELECT COUNT(*) AS "__count"
  FROM
"blog_article"
 INNER JOIN
"taggit_taggeditem"
    ON
("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12))
 INNER JOIN
"taggit_tag"
    ON
("taggit_taggeditem"."tag_id" = "taggit_tag"."id")
 WHERE
("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('is-this-lego'))
SELECT ••• FROM "blog_article" INNER JOIN "taggit_taggeditem" ON ("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12)) INNER JOIN "taggit_tag" ON ("taggit_taggeditem"."tag_id" = "taggit_tag"."id") WHERE ("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('is-this-lego'))
8 similar queries.
2.17

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(60)
  s['num_posts'] = Article.objects.filter(tags__slug__iexact=s['tag']).count()

SELECT COUNT(*) AS "__count"
  FROM
"blog_article"
 INNER JOIN
"taggit_taggeditem"
    ON
("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12))
 INNER JOIN
"taggit_tag"
    ON
("taggit_taggeditem"."tag_id" = "taggit_tag"."id")
 WHERE
("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('tips'))
SELECT ••• FROM "blog_article" INNER JOIN "taggit_taggeditem" ON ("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12)) INNER JOIN "taggit_tag" ON ("taggit_taggeditem"."tag_id" = "taggit_tag"."id") WHERE ("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('tips'))
8 similar queries.
2.14

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(60)
  s['num_posts'] = Article.objects.filter(tags__slug__iexact=s['tag']).count()

SELECT COUNT(*) AS "__count"
  FROM
"blog_article"
 INNER JOIN
"taggit_taggeditem"
    ON
("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12))
 INNER JOIN
"taggit_tag"
    ON
("taggit_taggeditem"."tag_id" = "taggit_tag"."id")
 WHERE
("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('rebricksberg'))
SELECT ••• FROM "blog_article" INNER JOIN "taggit_taggeditem" ON ("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12)) INNER JOIN "taggit_tag" ON ("taggit_taggeditem"."tag_id" = "taggit_tag"."id") WHERE ("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('rebricksberg'))
8 similar queries.
2.16

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(60)
  s['num_posts'] = Article.objects.filter(tags__slug__iexact=s['tag']).count()

SELECT COUNT(*) AS "__count"
  FROM
"blog_article"
 INNER JOIN
"taggit_taggeditem"
    ON
("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12))
 INNER JOIN
"taggit_tag"
    ON
("taggit_taggeditem"."tag_id" = "taggit_tag"."id")
 WHERE
("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('good-bad-ugly'))
SELECT ••• FROM "blog_article" INNER JOIN "taggit_taggeditem" ON ("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12)) INNER JOIN "taggit_tag" ON ("taggit_taggeditem"."tag_id" = "taggit_tag"."id") WHERE ("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('good-bad-ugly'))
8 similar queries.
2.15

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(150)
  article_series_images = get_series()

/home/nathan/rb/site/./blog/views.py in get_series(60)
  s['num_posts'] = Article.objects.filter(tags__slug__iexact=s['tag']).count()

SELECT "blog_article"."id",
       "blog_article"."title",
       "blog_article"."author_id",
       "blog_article"."published_date",
       "blog_article"."is_active",
       "blog_article"."body",
       "blog_article"."meta_description",
       "blog_article"."meta_img",
       "blog_article"."slug",
       "blog_article"."category_id",
       "blog_article"."ads",
       "blog_article"."show_ads_for_set_num",
       "blog_article"."review_for_set_num",
       "blog_article"."status",
       "blog_article"."scheduled_net",
       "blog_article"."ready_for_review_date",
       "blog_article"."is_sensitive",
       "blog_article"."search_vector"
  FROM
"blog_article"
 WHERE
("blog_article"."is_active" AND (("blog_article"."published_date" = '2026-10-24T00:00:00.076135+00:00'::timestamptz AND "blog_article"."id" > 976) OR "blog_article"."published_date" > '2026-10-24T00:00:00.076135+00:00'::timestamptz))
 ORDER BY
"blog_article"."published_date" ASC, "blog_article"."id" ASC
 LIMIT
1
SELECT ••• FROM "blog_article" WHERE ("blog_article"."is_active" AND (("blog_article"."published_date" = '2026-10-24T00:00:00.076135+00:00'::timestamptz AND "blog_article"."id" > 976) OR "blog_article"."published_date" > '2026-10-24T00:00:00.076135+00:00'::timestamptz)) ORDER BY "blog_article"."published_date" ASC, "blog_article"."id" ASC LIMIT 1
0.31

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(155)
  article.next = Article.get_next_by_published_date(article)

/usr/lib/python3.10/functools.py in _method(388)
  return self.func(cls_or_self, *self.args, *args, **keywords)

SELECT "blog_article"."id",
       "blog_article"."title",
       "blog_article"."author_id",
       "blog_article"."published_date",
       "blog_article"."is_active",
       "blog_article"."body",
       "blog_article"."meta_description",
       "blog_article"."meta_img",
       "blog_article"."slug",
       "blog_article"."category_id",
       "blog_article"."ads",
       "blog_article"."show_ads_for_set_num",
       "blog_article"."review_for_set_num",
       "blog_article"."status",
       "blog_article"."scheduled_net",
       "blog_article"."ready_for_review_date",
       "blog_article"."is_sensitive",
       "blog_article"."search_vector"
  FROM
"blog_article"
 WHERE
("blog_article"."is_active" AND (("blog_article"."published_date" = '2026-10-24T00:00:00.076135+00:00'::timestamptz AND "blog_article"."id" < 976) OR "blog_article"."published_date" < '2026-10-24T00:00:00.076135+00:00'::timestamptz))
 ORDER BY
"blog_article"."published_date" DESC, "blog_article"."id" DESC
 LIMIT
1
SELECT ••• FROM "blog_article" WHERE ("blog_article"."is_active" AND (("blog_article"."published_date" = '2026-10-24T00:00:00.076135+00:00'::timestamptz AND "blog_article"."id" < 976) OR "blog_article"."published_date" < '2026-10-24T00:00:00.076135+00:00'::timestamptz)) ORDER BY "blog_article"."published_date" DESC, "blog_article"."id" DESC LIMIT 1
0.42

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(159)
  article.prev = Article.get_previous_by_published_date(article)

/usr/lib/python3.10/functools.py in _method(388)
  return self.func(cls_or_self, *self.args, *args, **keywords)

SELECT "lego_baseset"."id",
       "lego_baseset"."set_num",
       "lego_baseset"."name",
       "lego_baseset"."year",
       "lego_baseset"."theme_id",
       "lego_baseset"."set_type",
       "lego_baseset"."num_parts",
       "lego_baseset"."default_inventory_id",
       "lego_baseset"."is_active",
       "lego_baseset"."is_accessory",
       "lego_baseset"."added_dt",
       "lego_baseset"."added_by_id",
       "lego_baseset"."last_modified_dt",
       "lego_baseset"."last_modified_by_id",
       "lego_baseset"."active_change_dt",
       "lego_baseset"."active_change_by_id",
       "lego_baseset"."last_checked_for_bi",
       "lego_baseset"."descr",
       "lego_baseset"."primary_photo_id",
       "lego_baseset"."primary_moc_image_id",
       "lego_baseset"."is_gear",
       "lego_baseset"."is_book",
       "lego_baseset"."search_vector",
       "lego_baseset"."mfhash_vector"
  FROM
"lego_baseset"
 WHERE
"lego_baseset"."set_num" = '75451-1'
 LIMIT
21
SELECT ••• FROM "lego_baseset" WHERE "lego_baseset"."set_num" = '75451-1' LIMIT 21
8.54

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(190)
  context['reviewed_sets'] = article.get_reviewed_sets

/home/nathan/rb/site/./blog/models.py in get_reviewed_sets(146)
  sets.append(BaseSet.all_objects.get(set_num=sn))

SELECT "lego_baseset"."id",
       "lego_baseset"."set_num",
       "lego_baseset"."name",
       "lego_baseset"."year",
       "lego_baseset"."theme_id",
       "lego_baseset"."set_type",
       "lego_baseset"."num_parts",
       "lego_baseset"."default_inventory_id",
       "lego_baseset"."is_active",
       "lego_baseset"."is_accessory",
       "lego_baseset"."added_dt",
       "lego_baseset"."added_by_id",
       "lego_baseset"."last_modified_dt",
       "lego_baseset"."last_modified_by_id",
       "lego_baseset"."active_change_dt",
       "lego_baseset"."active_change_by_id",
       "lego_baseset"."last_checked_for_bi",
       "lego_baseset"."descr",
       "lego_baseset"."primary_photo_id",
       "lego_baseset"."primary_moc_image_id",
       "lego_baseset"."is_gear",
       "lego_baseset"."is_book",
       "lego_baseset"."search_vector",
       "lego_baseset"."mfhash_vector",
       "lego_set"."baseset_ptr_id",
       "lego_set"."start_date",
       "lego_set"."end_date",
       "lego_theme"."id",
       "lego_theme"."parent_id",
       "lego_theme"."name",
       "lego_theme"."slug",
       "lego_theme"."set_count",
       "lego_theme"."t1_id",
       "lego_theme"."t1_name",
       "lego_theme"."t2_name",
       "lego_theme"."t3_name",
       "lego_theme"."lego_blurb",
       "lego_theme"."banner_img",
       "lego_theme"."descr",
       T4."id",
       T4."parent_id",
       T4."name",
       T4."slug",
       T4."set_count",
       T4."t1_id",
       T4."t1_name",
       T4."t2_name",
       T4."t3_name",
       T4."lego_blurb",
       T4."banner_img",
       T4."descr",
       T5."id",
       T5."parent_id",
       T5."name",
       T5."slug",
       T5."set_count",
       T5."t1_id",
       T5."t1_name",
       T5."t2_name",
       T5."t3_name",
       T5."lego_blurb",
       T5."banner_img",
       T5."descr",
       "lego_setstatstotal"."set_id",
       "lego_setstatstotal"."hits",
       "lego_setstatstotal"."builds",
       "lego_setstatstotal"."likes",
       "lego_setstatstotal"."bi_downloads",
       "lego_setstatstotal"."featured_hits",
       "lego_setstatstotal"."user_hits"
  FROM
"lego_set"
 INNER JOIN
"lego_baseset"
    ON
("lego_set"."baseset_ptr_id" = "lego_baseset"."id")
 INNER JOIN
"lego_theme"
    ON
("lego_baseset"."theme_id" = "lego_theme"."id")
  LEFT OUTER JOIN
"lego_theme" T4
    ON
("lego_theme"."parent_id" = T4."id")
  LEFT OUTER JOIN
"lego_theme" T5
    ON
(T4."parent_id" = T5."id")
  LEFT OUTER JOIN
"lego_setstatstotal"
    ON
("lego_baseset"."id" = "lego_setstatstotal"."set_id")
 WHERE
("lego_baseset"."is_active" AND "lego_baseset"."set_num" = '75451-1')
 LIMIT
21
SELECT ••• FROM "lego_set" INNER JOIN "lego_baseset" ON ("lego_set"."baseset_ptr_id" = "lego_baseset"."id") INNER JOIN "lego_theme" ON ("lego_baseset"."theme_id" = "lego_theme"."id") LEFT OUTER JOIN "lego_theme" T4 ON ("lego_theme"."parent_id" = T4."id") LEFT OUTER JOIN "lego_theme" T5 ON (T4."parent_id" = T5."id") LEFT OUTER JOIN "lego_setstatstotal" ON ("lego_baseset"."id" = "lego_setstatstotal"."set_id") WHERE ("lego_baseset"."is_active" AND "lego_baseset"."set_num" = '75451-1') LIMIT 21
0.70

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(203)
  context['lego_affiliate_links'] = get_lego_affiliate_links(article.show_ads_for_set_num_short)

/home/nathan/rb/site/./lego/buy/sets.py in get_lego_affiliate_links(464)
  set = get_or_none(Set.objects, set_num=set_num + '-1')

/home/nathan/rb/site/./rb/utils.py in get_or_none(734)
  return manager.get(**kwargs)

SELECT DISTINCT ("taggit_taggeditem"."object_id") AS "_prefetch_related_val",
       "taggit_tag"."id",
       "taggit_tag"."name",
       "taggit_tag"."slug"
  FROM
"taggit_tag"
 INNER JOIN
"taggit_taggeditem"
    ON
("taggit_tag"."id" = "taggit_taggeditem"."tag_id")
 INNER JOIN
"django_content_type"
    ON
("taggit_taggeditem"."content_type_id" = "django_content_type"."id")
 WHERE
("django_content_type"."app_label" = 'lego' AND "django_content_type"."model" = 'set' AND "taggit_taggeditem"."object_id" IN (329809))
SELECT ••• FROM "taggit_tag" INNER JOIN "taggit_taggeditem" ON ("taggit_tag"."id" = "taggit_taggeditem"."tag_id") INNER JOIN "django_content_type" ON ("taggit_taggeditem"."content_type_id" = "django_content_type"."id") WHERE ("django_content_type"."app_label" = 'lego' AND "django_content_type"."model" = 'set' AND "taggit_taggeditem"."object_id" IN (329809))
0.36

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(203)
  context['lego_affiliate_links'] = get_lego_affiliate_links(article.show_ads_for_set_num_short)

/home/nathan/rb/site/./lego/buy/sets.py in get_lego_affiliate_links(464)
  set = get_or_none(Set.objects, set_num=set_num + '-1')

/home/nathan/rb/site/./rb/utils.py in get_or_none(734)
  return manager.get(**kwargs)

SELECT "lego_storesetitem"."id",
       "lego_storesetitem"."store_id",
       "lego_storesetitem"."is_used",
       "lego_storesetitem"."cost",
       "lego_storesetitem"."cost_usd",
       "lego_storesetitem"."sale_cost",
       "lego_storesetitem"."sku",
       "lego_storesetitem"."item_url",
       "lego_storesetitem"."quantity",
       "lego_storesetitem"."timestamp",
       "lego_storesetitem"."set_id",
       "lego_store"."id",
       "lego_store"."name",
       "lego_store"."is_active",
       "lego_store"."store_url",
       "lego_store"."add_item_url",
       "lego_store"."feed_url",
       "lego_store"."tag_line",
       "lego_store"."currency_code",
       "lego_store"."country_code",
       "lego_store"."bricklink_sellername",
       "lego_store"."ships_to"
  FROM
"lego_storesetitem"
 INNER JOIN
"lego_store"
    ON
("lego_storesetitem"."store_id" = "lego_store"."id")
 WHERE
(NOT "lego_storesetitem"."is_used" AND "lego_storesetitem"."set_id" = 329809 AND "lego_storesetitem"."store_id" IN (SELECT U0."id" FROM "lego_store" U0 WHERE (U0."is_active" AND UPPER(U0."store_url"::text) LIKE UPPER('%linksynergy.com%'))))
SELECT ••• FROM "lego_storesetitem" INNER JOIN "lego_store" ON ("lego_storesetitem"."store_id" = "lego_store"."id") WHERE (NOT "lego_storesetitem"."is_used" AND "lego_storesetitem"."set_id" = 329809 AND "lego_storesetitem"."store_id" IN (SELECT ••• FROM "lego_store" U0 WHERE (U0."is_active" AND UPPER(U0."store_url"::text) LIKE UPPER('%linksynergy.com%'))))
2.63

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(203)
  context['lego_affiliate_links'] = get_lego_affiliate_links(article.show_ads_for_set_num_short)

/home/nathan/rb/site/./lego/buy/sets.py in get_lego_affiliate_links(470)
  if not items:

SELECT "lego_baseset"."id",
       "lego_baseset"."set_num",
       "lego_baseset"."name",
       "lego_baseset"."year",
       "lego_baseset"."theme_id",
       "lego_baseset"."set_type",
       "lego_baseset"."num_parts",
       "lego_baseset"."default_inventory_id",
       "lego_baseset"."is_active",
       "lego_baseset"."is_accessory",
       "lego_baseset"."added_dt",
       "lego_baseset"."added_by_id",
       "lego_baseset"."last_modified_dt",
       "lego_baseset"."last_modified_by_id",
       "lego_baseset"."active_change_dt",
       "lego_baseset"."active_change_by_id",
       "lego_baseset"."last_checked_for_bi",
       "lego_baseset"."descr",
       "lego_baseset"."primary_photo_id",
       "lego_baseset"."primary_moc_image_id",
       "lego_baseset"."is_gear",
       "lego_baseset"."is_book",
       "lego_baseset"."search_vector",
       "lego_baseset"."mfhash_vector",
       "lego_theme"."id",
       "lego_theme"."parent_id",
       "lego_theme"."name",
       "lego_theme"."slug",
       "lego_theme"."set_count",
       "lego_theme"."t1_id",
       "lego_theme"."t1_name",
       "lego_theme"."t2_name",
       "lego_theme"."t3_name",
       "lego_theme"."lego_blurb",
       "lego_theme"."banner_img",
       "lego_theme"."descr",
       T3."id",
       T3."parent_id",
       T3."name",
       T3."slug",
       T3."set_count",
       T3."t1_id",
       T3."t1_name",
       T3."t2_name",
       T3."t3_name",
       T3."lego_blurb",
       T3."banner_img",
       T3."descr",
       T4."id",
       T4."parent_id",
       T4."name",
       T4."slug",
       T4."set_count",
       T4."t1_id",
       T4."t1_name",
       T4."t2_name",
       T4."t3_name",
       T4."lego_blurb",
       T4."banner_img",
       T4."descr",
       "lego_setstatstotal"."set_id",
       "lego_setstatstotal"."hits",
       "lego_setstatstotal"."builds",
       "lego_setstatstotal"."likes",
       "lego_setstatstotal"."bi_downloads",
       "lego_setstatstotal"."featured_hits",
       "lego_setstatstotal"."user_hits"
  FROM
"lego_baseset"
 INNER JOIN
"lego_theme"
    ON
("lego_baseset"."theme_id" = "lego_theme"."id")
  LEFT OUTER JOIN
"lego_theme" T3
    ON
("lego_theme"."parent_id" = T3."id")
  LEFT OUTER JOIN
"lego_theme" T4
    ON
(T3."parent_id" = T4."id")
  LEFT OUTER JOIN
"lego_setstatstotal"
    ON
("lego_baseset"."id" = "lego_setstatstotal"."set_id")
 WHERE
("lego_baseset"."is_active" AND "lego_baseset"."set_num" = '75451-1')
 LIMIT
21
SELECT ••• FROM "lego_baseset" INNER JOIN "lego_theme" ON ("lego_baseset"."theme_id" = "lego_theme"."id") LEFT OUTER JOIN "lego_theme" T3 ON ("lego_theme"."parent_id" = T3."id") LEFT OUTER JOIN "lego_theme" T4 ON (T3."parent_id" = T4."id") LEFT OUTER JOIN "lego_setstatstotal" ON ("lego_baseset"."id" = "lego_setstatstotal"."set_id") WHERE ("lego_baseset"."is_active" AND "lego_baseset"."set_num" = '75451-1') LIMIT 21
0.64

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(204)
  context['lego_affiliate_links_set'] = get_or_none(BaseSet.objects, set_num=article.show_ads_for_set_num_short + '-1')

/home/nathan/rb/site/./rb/utils.py in get_or_none(734)
  return manager.get(**kwargs)

SELECT "auth_user"."id",
       "auth_user"."password",
       "auth_user"."last_login",
       "auth_user"."is_superuser",
       "auth_user"."username",
       "auth_user"."first_name",
       "auth_user"."last_name",
       "auth_user"."email",
       "auth_user"."is_staff",
       "auth_user"."is_active",
       "auth_user"."date_joined"
  FROM
"auth_user"
 WHERE
"auth_user"."id" = 375158
 LIMIT
21
SELECT ••• FROM "auth_user" WHERE "auth_user"."id" = 375158 LIMIT 21
0.14

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

54 "dateModified": "{{ article.published_date|date:'c' }}",
55 "author": {
56 "@type": "Person",
57 "name": "{{ article.author.username }}"
58 },
59 "publisher": {
60 "@type": "Organization",
61 "name": "Rebrickable",

/home/nathan/rb/site/blog/templates/blog/blog_article.html

SELECT "countries_plus_country"."iso",
       "countries_plus_country"."iso3",
       "countries_plus_country"."iso_numeric",
       "countries_plus_country"."fips",
       "countries_plus_country"."name",
       "countries_plus_country"."capital",
       "countries_plus_country"."area",
       "countries_plus_country"."population",
       "countries_plus_country"."continent",
       "countries_plus_country"."tld",
       "countries_plus_country"."currency_code",
       "countries_plus_country"."currency_symbol",
       "countries_plus_country"."currency_name",
       "countries_plus_country"."phone",
       "countries_plus_country"."postal_code_format",
       "countries_plus_country"."postal_code_regex",
       "countries_plus_country"."languages",
       "countries_plus_country"."geonameid",
       "countries_plus_country"."neighbours",
       "countries_plus_country"."equivalent_fips_code"
  FROM
"countries_plus_country"
 WHERE
"countries_plus_country"."iso" = 'US'
 LIMIT
21
SELECT ••• FROM "countries_plus_country" WHERE "countries_plus_country"."iso" = 'US' LIMIT 21
0.15

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./rb/templatetags/rb_geo.py in geo_currency(20)
  geo_data = user.geo.get_user_currency()

/home/nathan/rb/site/./geo/geo.py in get_user_currency(253)
  country = Country.objects.get(iso=country_code)

74 </a>
75 </li>
76 <li>
77 {% geo_currency request.user %}
78 </li>
79 {% comment %}
80 <li class="hidden-xs hidden-sm">
81 <a href={% if request.user.is_authenticated %}"{% url 'user_profile_settings' request.user.get_username %}#personalisation"{% else %}"#" onclick="return false;"{% endif %} title="All date/times are being converted to this timezone">{% get_user_timezone request.user %}</a>

/home/nathan/rb/site/rb/templates/rb/includes/topbar.html

SELECT "blog_articlecategory"."id",
       "blog_articlecategory"."name"
  FROM
"blog_articlecategory"
 WHERE
"blog_articlecategory"."id" = 1
 LIMIT
21
SELECT ••• FROM "blog_articlecategory" WHERE "blog_articlecategory"."id" = 1 LIMIT 21
0.10

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

18
19 {% block breadcrumbs %}
20 {% breadcrumb "Blog Posts" "blog_index" %}
21 {% breadcrumb article.category "blog_by_category" article.category %}
22 {% breadcrumb article.title "blog_article" article.id %}
23 {% endblock %}
24
25 {% block meta_description %}{{ article.meta_description }}{% endblock meta_description %}

/home/nathan/rb/site/blog/templates/blog/blog_article.html

SELECT "auth_user"."id",
       "auth_user"."password",
       "auth_user"."last_login",
       "auth_user"."is_superuser",
       "auth_user"."username",
       "auth_user"."first_name",
       "auth_user"."last_name",
       "auth_user"."email",
       "auth_user"."is_staff",
       "auth_user"."is_active",
       "auth_user"."date_joined"
  FROM
"auth_user"
 WHERE
"auth_user"."username" = 'Chricki'
 LIMIT
21
SELECT ••• FROM "auth_user" WHERE "auth_user"."username" = 'Chricki' LIMIT 21
2 similar queries. Duplicated 2 times.
0.09

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./avatar/templatetags/avatar_tags.py in avatar_url(33)
  avatar_url = provider.get_avatar_url(user, size)

/home/nathan/rb/site/./avatar/providers.py in get_avatar_url(48)
  avatar = get_primary_avatar(user, size)

/home/nathan/rb/site/./avatar/utils.py in get_primary_avatar(112)
  user = get_user(user)

/home/nathan/rb/site/./avatar/utils.py in get_user(33)
  return get_user_model().objects.get_by_natural_key(username)

92 <!--<div class="flex-row">
93 <div class="mr-10 hidden-xs" style="width: 50px">
94 <a href="{% url 'blog_by_author' article.author.username %}">
95 <img data-src="{% avatar_url article.author.username 75 %}" width="50px" height="50px">
96 </a>
97 </div>
98 <div class="flex-expand">
99 <div class="heading-title heading-border-bottom heading-color mb-10">

/home/nathan/rb/site/blog/templates/blog/blog_article.html

SELECT "avatar_avatar"."id",
       "avatar_avatar"."user_id",
       "avatar_avatar"."primary",
       "avatar_avatar"."avatar",
       "avatar_avatar"."date_uploaded"
  FROM
"avatar_avatar"
 WHERE
"avatar_avatar"."user_id" = 375158
 ORDER BY
"avatar_avatar"."primary" DESC, "avatar_avatar"."date_uploaded" DESC
 LIMIT
1
SELECT ••• FROM "avatar_avatar" WHERE "avatar_avatar"."user_id" = 375158 ORDER BY "avatar_avatar"."primary" DESC, "avatar_avatar"."date_uploaded" DESC LIMIT 1
2 similar queries. Duplicated 2 times.
0.10

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./avatar/templatetags/avatar_tags.py in avatar_url(33)
  avatar_url = provider.get_avatar_url(user, size)

/home/nathan/rb/site/./avatar/providers.py in get_avatar_url(48)
  avatar = get_primary_avatar(user, size)

/home/nathan/rb/site/./avatar/utils.py in get_primary_avatar(120)
  avatar = user.avatar_set.order_by("-primary", "-date_uploaded")[0]

92 <!--<div class="flex-row">
93 <div class="mr-10 hidden-xs" style="width: 50px">
94 <a href="{% url 'blog_by_author' article.author.username %}">
95 <img data-src="{% avatar_url article.author.username 75 %}" width="50px" height="50px">
96 </a>
97 </div>
98 <div class="flex-expand">
99 <div class="heading-title heading-border-bottom heading-color mb-10">

/home/nathan/rb/site/blog/templates/blog/blog_article.html

SELECT COUNT(*) AS "__count"
  FROM
"threadedcomments_comment"
 INNER JOIN
"django_comments"
    ON
("threadedcomments_comment"."comment_ptr_id" = "django_comments"."id")
 WHERE
("django_comments"."content_type_id" = 12 AND "django_comments"."object_pk" = '976' AND "django_comments"."site_id" = 1 AND "django_comments"."is_public" AND NOT "django_comments"."is_removed")
SELECT ••• FROM "threadedcomments_comment" INNER JOIN "django_comments" ON ("threadedcomments_comment"."comment_ptr_id" = "django_comments"."id") WHERE ("django_comments"."content_type_id" = 12 AND "django_comments"."object_pk" = '976' AND "django_comments"."site_id" = 1 AND "django_comments"."is_public" AND NOT "django_comments"."is_removed")
2 similar queries. Duplicated 2 times.
1.75

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/venv_rb310/lib/python3.10/site-packages/django_comments/templatetags/comments.py in render(72)
  context[self.as_varname] = self.get_context_value_from_queryset(context, qs)

/home/nathan/venv_rb310/lib/python3.10/site-packages/threadedcomments/templatetags/threadedcomments_tags.py in get_context_value_from_queryset(116)
  return qs.count()

24
25 <div class="rb-article-card__meta flex-right hidden-xs hidden-sm">
26 {% if full_layout %}
27 {% get_comment_count for article as num_comments %}
28 <div>
29 <a href="{% url 'blog_article_w_slug' article.id article.slug %}#comments">
30 <i class="fa fa-comment-o"></i>
31 {{ num_comments }}<span> Comment{{ num_comments|pluralize }}</span>

/home/nathan/rb/site/blog/templates/blog/includes/render_article_byline.html

SELECT "blog_articlestats"."article_id",
       "blog_articlestats"."hits"
  FROM
"blog_articlestats"
 WHERE
"blog_articlestats"."article_id" = 976
 LIMIT
21
SELECT ••• FROM "blog_articlestats" WHERE "blog_articlestats"."article_id" = 976 LIMIT 21
0.10

Connection: default

Transaction status: In transaction

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/usr/lib/python3.10/contextlib.py in inner(79)
  return func(*args, **kwds)

/home/nathan/venv_rb310/lib/python3.10/site-packages/annoying/fields.py in __get__(36)
  .__get__(instance, instance_type)

33 </div>
34 {% endif %}
35
36 {% if article.stats.hits > 100 %}
37 <div>
38 <i class="fa fa-line-chart"></i>
39 <span>{{ article.stats.hits|floor_100 }} views</span>
40 </div>

/home/nathan/rb/site/blog/templates/blog/includes/render_article_byline.html

SELECT "auth_user"."id",
       "auth_user"."password",
       "auth_user"."last_login",
       "auth_user"."is_superuser",
       "auth_user"."username",
       "auth_user"."first_name",
       "auth_user"."last_name",
       "auth_user"."email",
       "auth_user"."is_staff",
       "auth_user"."is_active",
       "auth_user"."date_joined"
  FROM
"auth_user"
 WHERE
"auth_user"."username" = 'Chricki'
 LIMIT
21
SELECT ••• FROM "auth_user" WHERE "auth_user"."username" = 'Chricki' LIMIT 21
2 similar queries. Duplicated 2 times.
0.08

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./avatar/templatetags/avatar_tags.py in avatar_url(33)
  avatar_url = provider.get_avatar_url(user, size)

/home/nathan/rb/site/./avatar/providers.py in get_avatar_url(48)
  avatar = get_primary_avatar(user, size)

/home/nathan/rb/site/./avatar/utils.py in get_primary_avatar(112)
  user = get_user(user)

/home/nathan/rb/site/./avatar/utils.py in get_user(33)
  return get_user_model().objects.get_by_natural_key(username)

107 <div class="rb-article-card__top">
108 <span class="rb-article-card__avatar hidden-xs">
109 <a href="{% url 'blog_by_author' article.author.username %}">
110 <img data-src="{% avatar_url article.author.username 75 %}" width="50" height="50" alt="{{ article.author.username }}">
111 </a>
112 </span>
113
114 <h1 id="blog_title" class="rb-article-card__title rb-article-card__title--lg">

/home/nathan/rb/site/blog/templates/blog/blog_article.html

SELECT "avatar_avatar"."id",
       "avatar_avatar"."user_id",
       "avatar_avatar"."primary",
       "avatar_avatar"."avatar",
       "avatar_avatar"."date_uploaded"
  FROM
"avatar_avatar"
 WHERE
"avatar_avatar"."user_id" = 375158
 ORDER BY
"avatar_avatar"."primary" DESC, "avatar_avatar"."date_uploaded" DESC
 LIMIT
1
SELECT ••• FROM "avatar_avatar" WHERE "avatar_avatar"."user_id" = 375158 ORDER BY "avatar_avatar"."primary" DESC, "avatar_avatar"."date_uploaded" DESC LIMIT 1
2 similar queries. Duplicated 2 times.
0.08

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./avatar/templatetags/avatar_tags.py in avatar_url(33)
  avatar_url = provider.get_avatar_url(user, size)

/home/nathan/rb/site/./avatar/providers.py in get_avatar_url(48)
  avatar = get_primary_avatar(user, size)

/home/nathan/rb/site/./avatar/utils.py in get_primary_avatar(120)
  avatar = user.avatar_set.order_by("-primary", "-date_uploaded")[0]

107 <div class="rb-article-card__top">
108 <span class="rb-article-card__avatar hidden-xs">
109 <a href="{% url 'blog_by_author' article.author.username %}">
110 <img data-src="{% avatar_url article.author.username 75 %}" width="50" height="50" alt="{{ article.author.username }}">
111 </a>
112 </span>
113
114 <h1 id="blog_title" class="rb-article-card__title rb-article-card__title--lg">

/home/nathan/rb/site/blog/templates/blog/blog_article.html

SELECT COUNT(*) AS "__count"
  FROM
"threadedcomments_comment"
 INNER JOIN
"django_comments"
    ON
("threadedcomments_comment"."comment_ptr_id" = "django_comments"."id")
 WHERE
("django_comments"."content_type_id" = 12 AND "django_comments"."object_pk" = '976' AND "django_comments"."site_id" = 1 AND "django_comments"."is_public" AND NOT "django_comments"."is_removed")
SELECT ••• FROM "threadedcomments_comment" INNER JOIN "django_comments" ON ("threadedcomments_comment"."comment_ptr_id" = "django_comments"."id") WHERE ("django_comments"."content_type_id" = 12 AND "django_comments"."object_pk" = '976' AND "django_comments"."site_id" = 1 AND "django_comments"."is_public" AND NOT "django_comments"."is_removed")
2 similar queries. Duplicated 2 times.
0.19

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/venv_rb310/lib/python3.10/site-packages/django_comments/templatetags/comments.py in render(72)
  context[self.as_varname] = self.get_context_value_from_queryset(context, qs)

/home/nathan/venv_rb310/lib/python3.10/site-packages/threadedcomments/templatetags/threadedcomments_tags.py in get_context_value_from_queryset(116)
  return qs.count()

24
25 <div class="rb-article-card__meta flex-right hidden-xs hidden-sm">
26 {% if full_layout %}
27 {% get_comment_count for article as num_comments %}
28 <div>
29 <a href="{% url 'blog_article_w_slug' article.id article.slug %}#comments">
30 <i class="fa fa-comment-o"></i>
31 {{ num_comments }}<span> Comment{{ num_comments|pluralize }}</span>

/home/nathan/rb/site/blog/templates/blog/includes/render_article_byline.html

SELECT "lego_setphoto"."id",
       "lego_setphoto"."set_id",
       "lego_setphoto"."photo_type_id",
       "lego_setphoto"."submitted_by_id",
       "lego_setphoto"."timestamp",
       "lego_setphoto"."is_active",
       "lego_setphoto"."is_primary"
  FROM
"lego_setphoto"
 WHERE
"lego_setphoto"."id" = 171843
 LIMIT
21
SELECT ••• FROM "lego_setphoto" WHERE "lego_setphoto"."id" = 171843 LIMIT 21
2 similar queries. Duplicated 2 times.
0.11

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./lego/models/sets.py in img_dir(785)
  file_dir = self.primary_photo.get_img_dir()

155 <div class="flex-row">
156 {% if lego_affiliate_links_set %}
157 <div class="mr-10 hidden-xs" style="width: 150px">
158 {% include 'lego/includes/render_set_img.html' with img_file=lego_affiliate_links_set.img_dir tn_options=tn_options %}
159 </div>
160 {% endif %}
161 <div class="flex-expand">
162 <p><b>LEGO Set {{ article.show_ads_for_set_num }} is available now at the LEGO Shop in these locations:

/home/nathan/rb/site/blog/templates/blog/blog_article.html

SELECT "lego_baseset"."id",
       "lego_baseset"."set_num",
       "lego_baseset"."name",
       "lego_baseset"."year",
       "lego_baseset"."theme_id",
       "lego_baseset"."set_type",
       "lego_baseset"."num_parts",
       "lego_baseset"."default_inventory_id",
       "lego_baseset"."is_active",
       "lego_baseset"."is_accessory",
       "lego_baseset"."added_dt",
       "lego_baseset"."added_by_id",
       "lego_baseset"."last_modified_dt",
       "lego_baseset"."last_modified_by_id",
       "lego_baseset"."active_change_dt",
       "lego_baseset"."active_change_by_id",
       "lego_baseset"."last_checked_for_bi",
       "lego_baseset"."descr",
       "lego_baseset"."primary_photo_id",
       "lego_baseset"."primary_moc_image_id",
       "lego_baseset"."is_gear",
       "lego_baseset"."is_book",
       "lego_baseset"."search_vector",
       "lego_baseset"."mfhash_vector"
  FROM
"lego_baseset"
 WHERE
"lego_baseset"."id" = 329809
 LIMIT
21
SELECT ••• FROM "lego_baseset" WHERE "lego_baseset"."id" = 329809 LIMIT 21
2 similar queries. Duplicated 2 times.
0.19

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./lego/models/sets.py in img_dir(785)
  file_dir = self.primary_photo.get_img_dir()

/home/nathan/rb/site/./lego/models/sets.py in get_img_dir(3210)
  return os.path.join('sets', self.set.set_num.lower(), str(self.id) + '.jpg')

155 <div class="flex-row">
156 {% if lego_affiliate_links_set %}
157 <div class="mr-10 hidden-xs" style="width: 150px">
158 {% include 'lego/includes/render_set_img.html' with img_file=lego_affiliate_links_set.img_dir tn_options=tn_options %}
159 </div>
160 {% endif %}
161 <div class="flex-expand">
162 <p><b>LEGO Set {{ article.show_ads_for_set_num }} is available now at the LEGO Shop in these locations:

/home/nathan/rb/site/blog/templates/blog/blog_article.html

SELECT "lego_setphoto"."id",
       "lego_setphoto"."set_id",
       "lego_setphoto"."photo_type_id",
       "lego_setphoto"."submitted_by_id",
       "lego_setphoto"."timestamp",
       "lego_setphoto"."is_active",
       "lego_setphoto"."is_primary"
  FROM
"lego_setphoto"
 WHERE
"lego_setphoto"."id" = 171843
 LIMIT
21
SELECT ••• FROM "lego_setphoto" WHERE "lego_setphoto"."id" = 171843 LIMIT 21
2 similar queries. Duplicated 2 times.
0.12

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./lego/models/sets.py in img_dir(785)
  file_dir = self.primary_photo.get_img_dir()

42 {# Image #}
43 <div class="rb-card__image {% if set.is_figure %} js-hover-card{% endif %}" {% if set.is_figure %}data-hover="{% url 'minfig_hover' set.set_num %}"{% endif %}>
44 <a href="{{ set.get_absolute_url }}{% if inventory and not set.is_moc %}?inventory={{ inventory.version }}{% endif %}">
45 {% if not set.img_dir and set.is_figure %}
46 {% include 'lego/includes/render_set_img.html' with img_file='nil_mf.jpg' tn_options=tn_options %}
47 {% else %}
48 {% include 'lego/includes/render_set_img.html' with img_file=set.img_dir tn_options=tn_options %}
49 {% endif %}

/home/nathan/rb/site/lego/templates/sets/render_set.html

SELECT "lego_baseset"."id",
       "lego_baseset"."set_num",
       "lego_baseset"."name",
       "lego_baseset"."year",
       "lego_baseset"."theme_id",
       "lego_baseset"."set_type",
       "lego_baseset"."num_parts",
       "lego_baseset"."default_inventory_id",
       "lego_baseset"."is_active",
       "lego_baseset"."is_accessory",
       "lego_baseset"."added_dt",
       "lego_baseset"."added_by_id",
       "lego_baseset"."last_modified_dt",
       "lego_baseset"."last_modified_by_id",
       "lego_baseset"."active_change_dt",
       "lego_baseset"."active_change_by_id",
       "lego_baseset"."last_checked_for_bi",
       "lego_baseset"."descr",
       "lego_baseset"."primary_photo_id",
       "lego_baseset"."primary_moc_image_id",
       "lego_baseset"."is_gear",
       "lego_baseset"."is_book",
       "lego_baseset"."search_vector",
       "lego_baseset"."mfhash_vector"
  FROM
"lego_baseset"
 WHERE
"lego_baseset"."id" = 329809
 LIMIT
21
SELECT ••• FROM "lego_baseset" WHERE "lego_baseset"."id" = 329809 LIMIT 21
2 similar queries. Duplicated 2 times.
0.14

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./lego/models/sets.py in img_dir(785)
  file_dir = self.primary_photo.get_img_dir()

/home/nathan/rb/site/./lego/models/sets.py in get_img_dir(3210)
  return os.path.join('sets', self.set.set_num.lower(), str(self.id) + '.jpg')

42 {# Image #}
43 <div class="rb-card__image {% if set.is_figure %} js-hover-card{% endif %}" {% if set.is_figure %}data-hover="{% url 'minfig_hover' set.set_num %}"{% endif %}>
44 <a href="{{ set.get_absolute_url }}{% if inventory and not set.is_moc %}?inventory={{ inventory.version }}{% endif %}">
45 {% if not set.img_dir and set.is_figure %}
46 {% include 'lego/includes/render_set_img.html' with img_file='nil_mf.jpg' tn_options=tn_options %}
47 {% else %}
48 {% include 'lego/includes/render_set_img.html' with img_file=set.img_dir tn_options=tn_options %}
49 {% endif %}

/home/nathan/rb/site/lego/templates/sets/render_set.html

SELECT "lego_theme"."id",
       "lego_theme"."parent_id",
       "lego_theme"."name",
       "lego_theme"."slug",
       "lego_theme"."set_count",
       "lego_theme"."t1_id",
       "lego_theme"."t1_name",
       "lego_theme"."t2_name",
       "lego_theme"."t3_name",
       "lego_theme"."lego_blurb",
       "lego_theme"."banner_img",
       "lego_theme"."descr"
  FROM
"lego_theme"
 WHERE
"lego_theme"."id" = 158
 LIMIT
21
SELECT ••• FROM "lego_theme" WHERE "lego_theme"."id" = 158 LIMIT 21
0.12

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

137 <small class="trunc pull-left width-80pct" title="Filter on theme: {{ set.theme.get_full_name }}"><a href="?{% url_replace 'theme' set.theme.id %}">{{ set.theme.get_full_name }}</a></small>
138 <small class="pull-right" title="Filter on year {{ set.year }}"><a href="?{% url_replace 'min_year' set.year 'max_year' set.year %}">{{ set.year }}</a></small>
139 {% else %}
140 <small class="trunc pull-left width-80pct" title="{{ set.theme.get_full_name }}">{{ set.theme.get_full_name }}</small>
141 <small class="pull-right" title="{{ set.year }}">{{ set.year }}</small>
142 {% endif %}
143 </div>
144 {% endif %}

/home/nathan/rb/site/lego/templates/sets/render_set.html

SELECT DISTINCT "taggit_tag"."id",
       "taggit_tag"."name",
       "taggit_tag"."slug",
       COUNT("blog_article"."id") AS "count"
  FROM
"taggit_tag"
 INNER JOIN
"taggit_taggeditem"
    ON
("taggit_tag"."id" = "taggit_taggeditem"."tag_id")
 INNER JOIN
"django_content_type"
    ON
("taggit_taggeditem"."content_type_id" = "django_content_type"."id")
  LEFT OUTER JOIN
"blog_article"
    ON
("taggit_taggeditem"."object_id" = "blog_article"."id" AND ("taggit_taggeditem"."content_type_id" = 12))
 INNER JOIN
"taggit_taggeditem" T5
    ON
("taggit_tag"."id" = T5."tag_id")
 INNER JOIN
"blog_article" T6
    ON
(T5."object_id" = T6."id" AND (T5."content_type_id" = 12))
 WHERE
("django_content_type"."app_label" = 'blog' AND "django_content_type"."model" = 'article' AND T6."id" = 976)
 GROUP BY
"taggit_tag"."id"
SELECT ••• FROM "taggit_tag" INNER JOIN "taggit_taggeditem" ON ("taggit_tag"."id" = "taggit_taggeditem"."tag_id") INNER JOIN "django_content_type" ON ("taggit_taggeditem"."content_type_id" = "django_content_type"."id") LEFT OUTER JOIN "blog_article" ON ("taggit_taggeditem"."object_id" = "blog_article"."id" AND ("taggit_taggeditem"."content_type_id" = 12)) INNER JOIN "taggit_taggeditem" T5 ON ("taggit_tag"."id" = T5."tag_id") INNER JOIN "blog_article" T6 ON (T5."object_id" = T6."id" AND (T5."content_type_id" = 12)) WHERE ("django_content_type"."app_label" = 'blog' AND "django_content_type"."model" = 'article' AND T6."id" = 976) GROUP BY "taggit_tag"."id"
81.22

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

1 <div id="blog_tags" class="clearfix tags_list mb-30">
2 {% for tag in article.tags_w_count %}
3 <a href="{% url 'blog_by_tag' tag.slug %}" class="tag {% if request.user.is_blogger %}deltag{% endif %}">
4 <span class="txt">{{ tag.name }}</span>
5 <span class="num">
6 <span class="relative">

/home/nathan/rb/site/blog/templates/blog/includes/render_tags.html

SELECT (width*height) AS "area",
       "ads_banner"."id",
       "ads_banner"."width",
       "ads_banner"."height",
       "ads_banner"."start_date",
       "ads_banner"."end_date",
       "ads_banner"."country_code",
       "ads_banner"."html"
  FROM
"ads_banner"
 WHERE
("ads_banner"."start_date" < '2026-11-15T23:51:08.681784+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.681913+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 350 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.681757+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.682054+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:08.681784+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.681913+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 350 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.681757+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.682054+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
4 similar queries.
2.42

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./ads/templatetags/ads/drawing.py in render_banner(291)
  if not banners:

265 <h4 class="hidden-xs">TAGS</h4>
266 {% include 'blog/includes/render_tags.html' %}
267
268 {% render_banner 262 350 2 %}
269
270 {% include 'blog/includes/render_posts_preview_tabs.html' %}
271
272 <div class="mt-30">

/home/nathan/rb/site/blog/templates/blog/blog_article.html

SELECT (width*height) AS "area",
       "ads_banner"."id",
       "ads_banner"."width",
       "ads_banner"."height",
       "ads_banner"."start_date",
       "ads_banner"."end_date",
       "ads_banner"."country_code",
       "ads_banner"."html"
  FROM
"ads_banner"
 WHERE
("ads_banner"."start_date" < '2026-11-15T23:51:08.681784+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.681913+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 350 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.681757+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.682054+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
 ORDER BY
1 DESC, RANDOM() ASC
 LIMIT
1
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:08.681784+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.681913+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 350 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.681757+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.682054+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US') ORDER BY 1 DESC, RANDOM() ASC LIMIT 1
4 similar queries.
1.69

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./ads/templatetags/ads/drawing.py in render_banner(298)
  banner = banners.order_by('-area', '?')[0]

265 <h4 class="hidden-xs">TAGS</h4>
266 {% include 'blog/includes/render_tags.html' %}
267
268 {% render_banner 262 350 2 %}
269
270 {% include 'blog/includes/render_posts_preview_tabs.html' %}
271
272 <div class="mt-30">

/home/nathan/rb/site/blog/templates/blog/blog_article.html

SELECT (width*height) AS "area",
       "ads_banner"."id",
       "ads_banner"."width",
       "ads_banner"."height",
       "ads_banner"."start_date",
       "ads_banner"."end_date",
       "ads_banner"."country_code",
       "ads_banner"."html"
  FROM
"ads_banner"
 WHERE
("ads_banner"."start_date" < '2026-11-15T23:51:08.692876+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.692960+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.692863+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.693083+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:08.692876+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.692960+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.692863+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.693083+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
4 similar queries.
1.53

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./ads/templatetags/ads/drawing.py in render_banner(291)
  if not banners:

37 {% include 'blog/includes/render_posts_preview.html' with article=related_article %}
38 </div>
39 {% endfor %}
40 {% render_banner 262 600 5 %}
41 </div>
42 {% endif %}
43 <div id="tab_series" class="tab-pane {% if not related_articles %}active{% endif %}" role="tabpanel">
44 {% for series in article_series_images %}

/home/nathan/rb/site/blog/templates/blog/includes/render_posts_preview_tabs.html

SELECT (width*height) AS "area",
       "ads_banner"."id",
       "ads_banner"."width",
       "ads_banner"."height",
       "ads_banner"."start_date",
       "ads_banner"."end_date",
       "ads_banner"."country_code",
       "ads_banner"."html"
  FROM
"ads_banner"
 WHERE
("ads_banner"."start_date" < '2026-11-15T23:51:08.692876+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.692960+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.692863+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.693083+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
 ORDER BY
1 DESC, RANDOM() ASC
 LIMIT
1
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:08.692876+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.692960+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.692863+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.693083+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US') ORDER BY 1 DESC, RANDOM() ASC LIMIT 1
4 similar queries.
1.14

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./ads/templatetags/ads/drawing.py in render_banner(298)
  banner = banners.order_by('-area', '?')[0]

37 {% include 'blog/includes/render_posts_preview.html' with article=related_article %}
38 </div>
39 {% endfor %}
40 {% render_banner 262 600 5 %}
41 </div>
42 {% endif %}
43 <div id="tab_series" class="tab-pane {% if not related_articles %}active{% endif %}" role="tabpanel">
44 {% for series in article_series_images %}

/home/nathan/rb/site/blog/templates/blog/includes/render_posts_preview_tabs.html

SELECT (width*height) AS "area",
       "ads_banner"."id",
       "ads_banner"."width",
       "ads_banner"."height",
       "ads_banner"."start_date",
       "ads_banner"."end_date",
       "ads_banner"."country_code",
       "ads_banner"."html"
  FROM
"ads_banner"
 WHERE
("ads_banner"."start_date" < '2026-11-15T23:51:08.697737+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.697799+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.697727+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.697918+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:08.697737+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.697799+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.697727+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.697918+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
4 similar queries.
1.13

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./ads/templatetags/ads/drawing.py in render_banner(291)
  if not banners:

66 </div>
67 {% endfor %}
68
69 {% render_banner 262 600 5 %}
70 </div>
71 <div id="tab_popular" class="tab-pane" role="tabpanel">
72 {% for popular_article in popular_articles %}
73 <div class="mb-30">

/home/nathan/rb/site/blog/templates/blog/includes/render_posts_preview_tabs.html

SELECT (width*height) AS "area",
       "ads_banner"."id",
       "ads_banner"."width",
       "ads_banner"."height",
       "ads_banner"."start_date",
       "ads_banner"."end_date",
       "ads_banner"."country_code",
       "ads_banner"."html"
  FROM
"ads_banner"
 WHERE
("ads_banner"."start_date" < '2026-11-15T23:51:08.697737+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.697799+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.697727+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.697918+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
 ORDER BY
1 DESC, RANDOM() ASC
 LIMIT
1
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:08.697737+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.697799+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.697727+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.697918+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US') ORDER BY 1 DESC, RANDOM() ASC LIMIT 1
4 similar queries.
1.11

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./ads/templatetags/ads/drawing.py in render_banner(298)
  banner = banners.order_by('-area', '?')[0]

66 </div>
67 {% endfor %}
68
69 {% render_banner 262 600 5 %}
70 </div>
71 <div id="tab_popular" class="tab-pane" role="tabpanel">
72 {% for popular_article in popular_articles %}
73 <div class="mb-30">

/home/nathan/rb/site/blog/templates/blog/includes/render_posts_preview_tabs.html

SELECT (width*height) AS "area",
       "ads_banner"."id",
       "ads_banner"."width",
       "ads_banner"."height",
       "ads_banner"."start_date",
       "ads_banner"."end_date",
       "ads_banner"."country_code",
       "ads_banner"."html"
  FROM
"ads_banner"
 WHERE
("ads_banner"."start_date" < '2026-11-15T23:51:08.704789+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.704858+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.704778+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.704981+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:08.704789+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.704858+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.704778+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.704981+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
4 similar queries.
1.32

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./ads/templatetags/ads/drawing.py in render_banner(291)
  if not banners:

74 {% include 'blog/includes/render_posts_preview.html' with article=popular_article %}
75 </div>
76 {% endfor %}
77 {% render_banner 262 600 5 %}
78 </div>
79 </div>
80 </div>
81

/home/nathan/rb/site/blog/templates/blog/includes/render_posts_preview_tabs.html

SELECT (width*height) AS "area",
       "ads_banner"."id",
       "ads_banner"."width",
       "ads_banner"."height",
       "ads_banner"."start_date",
       "ads_banner"."end_date",
       "ads_banner"."country_code",
       "ads_banner"."html"
  FROM
"ads_banner"
 WHERE
("ads_banner"."start_date" < '2026-11-15T23:51:08.704789+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.704858+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.704778+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.704981+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
 ORDER BY
1 DESC, RANDOM() ASC
 LIMIT
1
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:08.704789+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:08.704858+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:08.704778+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:08.704981+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US') ORDER BY 1 DESC, RANDOM() ASC LIMIT 1
4 similar queries.
1.15

Connection: default

Transaction status: Idle

/home/nathan/rb/site/./blog/views.py in blog_article_w_slug(236)
  return blog_article(request, article_id)

/home/nathan/rb/site/./blog/views.py in blog_article(213)
  return cached_blog_article(request, article.id)

/home/nathan/rb/site/./rb/views/decorators/auth.py in wrapper(169)
  result = view_func(request, *args, **kwargs)

/home/nathan/rb/site/./blog/views.py in cached_blog_article(209)
  return render(request, 'blog/blog_article.html', context)

/home/nathan/rb/site/./ads/templatetags/ads/drawing.py in render_banner(298)
  banner = banners.order_by('-area', '?')[0]

74 {% include 'blog/includes/render_posts_preview.html' with article=popular_article %}
75 </div>
76 {% endfor %}
77 {% render_banner 262 600 5 %}
78 </div>
79 </div>
80 </div>
81

/home/nathan/rb/site/blog/templates/blog/includes/render_posts_preview_tabs.html

Log messages

No messages logged.