EDIT MODE

Pokémon sets with SMART bricks? I'm all in. But will I eventually have to buy 1,025 sets to catch 'em all? I hope not.

Contents:

The Set
The Box
The Instructions
The Parts
The Build
Conclusion

Background

LEGO Pokémon is arguably the most hyped thing in the LEGO-sphere for quite a while. It was big news that LEGO took over the license from rival Mega Construx (formerly Mega Bloks). Mega's Pokémon sets were pretty well received by fans and, compared to almost every other licensed theme made by Mega over the years, were actually pretty good looking. So the bar was high for LEGO to create some great sets to set them apart from what the fans already could get. Especially considering LEGO's higher price point.

Over the last decade Mega Construx released about 150 sets featuring around 130 different Pokémon. I was going to list all the available Pokémon for you but the list got so long it wasn't useful and so I stopped. They released small scale versions regularly in a kind of CMF type series, where the Pokémon came in a Poké ball container. Then they made larger scale sets akin to LEGO's SMART Play play-scale sets. Then they had larger display scale sets similar in style to the first LEGO sets they announced first. One in particular is a Pikachu set which was compared to LEGO's version upon release, with LEGO's version receiving some ridicule for not looking as good, and anger for being so much more expensive. Whilst I find most criticism to be unfair I do agree LEGO's Pikachu looks like he's trying to join the Ninja Turtles.

Enough talking about what building brick Pokémon was, let's look at what it is now. As I said above LEGO have taken the approach of having some play-scale sets for the kiddos, and some massively sized (part count and price tag wise) adult display level sets.

Icedragonj reviewed the impressive, and huge, 72153-1 - Venusaur, Charizard and Blastoise a few months ago, but the Summer wave of sets gave us the SMART Play scale sets. I reviewed a lot of Star Wars SMART Play sets and was impressed with what SMART Play could offer, but mildly disappointed by what it was currently offering. But I'm sure most people reading this know, SMART Play has not had a great welcome by LEGO fans. I think it's been treated unfairly. I'm keen to see if SMART Play has been more successful here than in the Star Wars sets. Fingers crossed!

The Set

Adventure awaits with SMART Play™: Mewtwo’s Lab Break (72163), a LEGO® Pokémon™ toy building set where the Legendary Mewtwo uses psychic power to destroy the lab monitor and escape from the tank it was created in. The dynamic set features a dial which, when turned, breaks open the chamber and frees an articulated Mewtwo figure with posable legs, arms, hands, head and tail. A Master Ball is also included for the Trainer to catch any Pokémon. The Mewtwo building toy incorporates a SMART Tag. SMART Bricks found in All-In-One Sets (sold separately) bring Pokémon Trainer adventures to life with immersive interactive play possibilities, enabling Pokémon and other play pieces to react with sounds, lights and more as kids move the Pokémon around. Transform any kid’s room into a champion’s retreat and inspire endless imaginative play with this action-packed Pokémon gift. Set contains 605 pieces.

...from LEGO.com

 

The Box

The box measured 265mm x 380mm x 70mm. Inside are 6 bags, 5 numbered 1 to 5 and 1 unnumbered, a sticker sheet, and 2 instruction manuals.

The Instructions

The instruction manuals measure:

  • BI 1 - 195mm x 175mm, has 84 pages and approximately 119 total build steps.
  • BI 2 - 195mm x 175mm, has 100 pages and approximately 108 total build steps.

The pdf of the instructions are available for download here.

The Parts

The set contains 605 parts and 19 spares, in 23 colors, and 36 part categories, with a total of 218 unique parts/color combinations.

Main colors are:

Main categories are:

 

New Parts

 

Parts in New Colors

 

New Prints

 

Rare Parts (3 or Less Set Appearances)

 

The Build

Bag 1

For those uninitiated, in Pokémon Red, Blue, and Yellow, you get one Master Poke Ball. Hopefully you don't waste is catching a Caterpie because Mewtwo is almost impossible to catch without it.

Mewtwo's torso is tight, utilizing all the new slopes to keep the build thin but strong enough. The belly hides the new 2x2 plate with cut-outs and the SMART tile. The new plates seem to exist to make it easier to remove the belly section to replace with a SMART Brick.

Bag 2

The legs rotate 360 degrees and look great. They are surprisingly strong too but require a Trans-clear round brick to help.

Bag 3

When my son first saw the tail his exact words were "I think LEGO have gone too exotic for his tail" which gave me a chuckle. I get what he's saying though, it's huge and looks even bigger when attached to Mewtwo. The arms are very basic but have elbow joints. The head looks great but once the connector parts on the back are in place it has limited articulation.

Bag 4

With Mewtwo done the base is next. This base recreates the stasis tank from Mewtwo Strikes Back's opening where we first see Mewtwo. It features a neat but simple mechanic where you can break Mewtwo free.

Bag 5

The finished tank is a little underwhelming to be honest. It's pretty flimsy and for those wanting to display the Pokémon I don't think it adds much to Mewtwo. But I get the need for LEGO to make it a bit more than just a buildable Pokémon.

Conclusion

A solid Pokémon set. No real complaints except for the slight underwhelming stasis tank. It's not bad and adds to the play it's just not awesome.

So how was the SMART Play? Well here's where I am disappointed. Mewtwo is a lone Pokémon. Sticking in the brick makes some noises when I shake him around, and it lights up, but without another Pokémon that seems to be it. Which is just kinda sucky. When he is hit the brick glows red and he grunts. If you are hoping to hear what a Mewtwo x Darth Vader crossover sounds like unfortunately the things don't seem to be allowed to interact at the same time. With Vader attached he still only made Mewtwo noises.

Is Mewtwo worth catching? If you're already a Pokéfan absolutely. This Pokémon is a must in your Pokédex. Otherwise, you could probably skip it. If you're looking for a Pokémon sets for your niece there's probably better options with multiple Pokémon that are more fun.

Build on,
Jared

Back to Top

Disclaimer: Anything said in this post is the opinion of the author and not The LEGO Group.
Parts and build photographs by Jared (© 2026 Rebrickable)

RebrickMat - LEGO Building Mat

In this review:

Mewtwo's Lab Break
72163-1
(605 parts)
Pokémon 2026
10318 Concorde
DJDT

Time

Resource usage

Resource Value
User CPU time 227.466 msec
System CPU time 14.131 msec
Total CPU time 241.597 msec
Elapsed time 1314.293 msec
Context switches 274 voluntary, 11 involuntary

Browser timing

Timing attribute Timeline Milliseconds since navigation start (+length)

SQL queries from 1 connection

  • default 1067.86 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" = 980)
 LIMIT
21
SELECT ••• FROM "blog_article" WHERE ("blog_article"."is_active" AND "blog_article"."id" = 980) LIMIT 21
9 similar queries.
0.51

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: 72163-1 - Mewtwo''s Lab Break') + SIMILARITY("blog_article"."body", 'Pokémon sets with SMART bricks? I''m all in. But will I eventually have to buy 1,025 sets to catch ''em all? I hope not. Contents: The SetThe BoxThe Instructions The PartsThe BuildConclusion Background LEGO Pokémon is arguably the most hyped thing in the LEGO-sphere for quite a while. It was big news that LEGO took over the license from rival Mega Construx (formerly Mega Bloks). Mega''s Pokémon sets were pretty well received by fans and, compared to almost every other licensed theme made by Mega over the years, were actually pretty good looking. So the bar was high for LEGO to create some great sets to set them apart from what the fans already could get. Especially considering LEGO''s higher price point. Over the last decade Mega Construx released about 150 sets featuring around 130 different Pokémon. I was going to list all the available Pokémon for you but the list got so long it wasn''t useful and so I stopped. They released small scale versions regularly in a kind of CMF type series, where the Pokémon came in a Poké ball container. Then they made larger scale sets akin to LEGO''s SMART Play play-scale sets. Then they had larger display scale sets similar in style to the first LEGO sets they announced first. One in particular is a Pikachu set which was compared to LEGO''s version upon release, with LEGO''s version receiving some ridicule for not looking as good, and anger for being so much more expensive. Whilst I find most criticism to be unfair I do agree LEGO''s Pikachu looks like he''s trying to join the Ninja Turtles. Enough talking about what building brick Pokémon was, let''s look at what it is now. As I said above LEGO have taken the approach of having some play-scale sets for the kiddos, and some massively sized (part count and price tag wise) adult display level sets. Icedragonj reviewed the impressive, and huge, 72153-1 - Venusaur, Charizard and Blastoise a few months ago, but the Summer wave of sets gave us the SMART Play scale sets. I reviewed a lot of Star Wars SMART Play sets and was impressed with what SMART Play could offer, but mildly disappointed by what it was currently offering. But I''m sure most people reading this know, SMART Play has not had a great welcome by LEGO fans. I think it''s been treated unfairly. I''m keen to see if SMART Play has been more successful here than in the Star Wars sets. Fingers crossed! The Set Adventure awaits with SMART Play™: Mewtwo’s Lab Break (72163), a LEGO® Pokémon™ toy building set where the Legendary Mewtwo uses psychic power to destroy the lab monitor and escape from the tank it was created in. The dynamic set features a dial which, when turned, breaks open the chamber and frees an articulated Mewtwo figure with posable legs, arms, hands, head and tail. A Master Ball is also included for the Trainer to catch any Pokémon. The Mewtwo building toy incorporates a SMART Tag. SMART Bricks found in All-In-One Sets (sold separately) bring Pokémon Trainer adventures to life with immersive interactive play possibilities, enabling Pokémon and other play pieces to react with sounds, lights and more as kids move the Pokémon around. Transform any kid’s room into a champion’s retreat and inspire endless imaginative play with this action-packed Pokémon gift. Set contains 605 pieces. ...from LEGO.com   The Box The box measured 265mm x 380mm x 70mm. Inside are 6 bags, 5 numbered 1 to 5 and 1 unnumbered, a sticker sheet, and 2 instruction manuals. The Instructions   The instruction manuals measure: BI 1 - 195mm x 175mm, has 84 pages and approximately 119 total build steps. BI 2 - 195mm x 175mm, has 100 pages and approximately 108 total build steps. The pdf of the instructions are available for download here. The Parts The set contains 605 parts and 19 spares, in 23 colors, and 36 part categories, with a total of 218 unique parts/color combinations.Main colors are: White: 69 unique parts, 228 quantity. Light Bluish Gray: 38 unique parts, 137 quantity. Dark Bluish Gray: 26 unique parts, 59 quantity. Main categories are: Plates Special: 29 unique parts, 85 quantity. Plates')) 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:01.563261+00:00'::timestamptz AND NOT ("blog_article"."id" = 980))
 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: 72163-1 - Mewtwo''s Lab Break') + SIMILARITY("blog_article"."body", 'Pokémon sets with SMART bricks? I''m all in. But will I eventually have to buy 1,025 sets to catch ''em all? I hope not. Contents: The SetThe BoxThe Instructions The PartsThe BuildConclusion Background LEGO Pokémon is arguably the most hyped thing in the LEGO-sphere for quite a while. It was big news that LEGO took over the license from rival Mega Construx (formerly Mega Bloks). Mega''s Pokémon sets were pretty well received by fans and, compared to almost every other licensed theme made by Mega over the years, were actually pretty good looking. So the bar was high for LEGO to create some great sets to set them apart from what the fans already could get. Especially considering LEGO''s higher price point. Over the last decade Mega Construx released about 150 sets featuring around 130 different Pokémon. I was going to list all the available Pokémon for you but the list got so long it wasn''t useful and so I stopped. They released small scale versions regularly in a kind of CMF type series, where the Pokémon came in a Poké ball container. Then they made larger scale sets akin to LEGO''s SMART Play play-scale sets. Then they had larger display scale sets similar in style to the first LEGO sets they announced first. One in particular is a Pikachu set which was compared to LEGO''s version upon release, with LEGO''s version receiving some ridicule for not looking as good, and anger for being so much more expensive. Whilst I find most criticism to be unfair I do agree LEGO''s Pikachu looks like he''s trying to join the Ninja Turtles. Enough talking about what building brick Pokémon was, let''s look at what it is now. As I said above LEGO have taken the approach of having some play-scale sets for the kiddos, and some massively sized (part count and price tag wise) adult display level sets. Icedragonj reviewed the impressive, and huge, 72153-1 - Venusaur, Charizard and Blastoise a few months ago, but the Summer wave of sets gave us the SMART Play scale sets. I reviewed a lot of Star Wars SMART Play sets and was impressed with what SMART Play could offer, but mildly disappointed by what it was currently offering. But I''m sure most people reading this know, SMART Play has not had a great welcome by LEGO fans. I think it''s been treated unfairly. I''m keen to see if SMART Play has been more successful here than in the Star Wars sets. Fingers crossed! The Set Adventure awaits with SMART Play™: Mewtwo’s Lab Break (72163), a LEGO® Pokémon™ toy building set where the Legendary Mewtwo uses psychic power to destroy the lab monitor and escape from the tank it was created in. The dynamic set features a dial which, when turned, breaks open the chamber and frees an articulated Mewtwo figure with posable legs, arms, hands, head and tail. A Master Ball is also included for the Trainer to catch any Pokémon. The Mewtwo building toy incorporates a SMART Tag. SMART Bricks found in All-In-One Sets (sold separately) bring Pokémon Trainer adventures to life with immersive interactive play possibilities, enabling Pokémon and other play pieces to react with sounds, lights and more as kids move the Pokémon around. Transform any kid’s room into a champion’s retreat and inspire endless imaginative play with this action-packed Pokémon gift. Set contains 605 pieces. ...from LEGO.com   The Box The box measured 265mm x 380mm x 70mm. Inside are 6 bags, 5 numbered 1 to 5 and 1 unnumbered, a sticker sheet, and 2 instruction manuals. The Instructions   The instruction manuals measure: BI 1 - 195mm x 175mm, has 84 pages and approximately 119 total build steps. BI 2 - 195mm x 175mm, has 100 pages and approximately 108 total build steps. The pdf of the instructions are available for download here. The Parts The set contains 605 parts and 19 spares, in 23 colors, and 36 part categories, with a total of 218 unique parts/color combinations.Main colors are: White: 69 unique parts, 228 quantity. Light Bluish Gray: 38 unique parts, 137 quantity. Dark Bluish Gray: 26 unique parts, 59 quantity. Main categories are: Plates Special: 29 unique parts, 85 quantity. Plates')) 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:01.563261+00:00'::timestamptz AND NOT ("blog_article"."id" = 980)) ORDER BY 19 DESC, "blog_article"."published_date" DESC LIMIT 20
913.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(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:02.491205+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:02.491205+00:00'::timestamptz) ORDER BY "blog_articlestats"."hits" DESC LIMIT 20
3.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(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.24

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.29

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.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(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.24

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.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(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.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(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.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(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.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(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.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('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.23

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.21

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.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 "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-27T00:00:00.075618+00:00'::timestamptz AND "blog_article"."id" > 980) OR "blog_article"."published_date" > '2026-10-27T00:00:00.075618+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-27T00:00:00.075618+00:00'::timestamptz AND "blog_article"."id" > 980) OR "blog_article"."published_date" > '2026-10-27T00:00:00.075618+00:00'::timestamptz)) ORDER BY "blog_article"."published_date" ASC, "blog_article"."id" ASC LIMIT 1
0.30

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-27T00:00:00.075618+00:00'::timestamptz AND "blog_article"."id" < 980) OR "blog_article"."published_date" < '2026-10-27T00:00:00.075618+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-27T00:00:00.075618+00:00'::timestamptz AND "blog_article"."id" < 980) OR "blog_article"."published_date" < '2026-10-27T00:00:00.075618+00:00'::timestamptz)) ORDER BY "blog_article"."published_date" DESC, "blog_article"."id" DESC LIMIT 1
0.47

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" = '72163-1'
 LIMIT
21
SELECT ••• FROM "lego_baseset" WHERE "lego_baseset"."set_num" = '72163-1' LIMIT 21
0.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(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" = '72163-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" = '72163-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 (335508))
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 (335508))
0.61

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" = 335508 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" = 335508 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%'))))
0.89

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" = '72163-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" = '72163-1') LIMIT 21
0.40

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" = 83025
 LIMIT
21
SELECT ••• FROM "auth_user" WHERE "auth_user"."id" = 83025 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)

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.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/./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.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)

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" = 'Jared_Wilhelm'
 LIMIT
21
SELECT ••• FROM "auth_user" WHERE "auth_user"."username" = 'Jared_Wilhelm' 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/./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" = 83025
 ORDER BY
"avatar_avatar"."primary" DESC, "avatar_avatar"."date_uploaded" DESC
 LIMIT
1
SELECT ••• FROM "avatar_avatar" WHERE "avatar_avatar"."user_id" = 83025 ORDER BY "avatar_avatar"."primary" DESC, "avatar_avatar"."date_uploaded" DESC LIMIT 1
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(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" = '980' 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" = '980' AND "django_comments"."site_id" = 1 AND "django_comments"."is_public" AND NOT "django_comments"."is_removed")
2 similar queries. Duplicated 2 times.
1.67

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" = 980
 LIMIT
21
SELECT ••• FROM "blog_articlestats" WHERE "blog_articlestats"."article_id" = 980 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" = 'Jared_Wilhelm'
 LIMIT
21
SELECT ••• FROM "auth_user" WHERE "auth_user"."username" = 'Jared_Wilhelm' LIMIT 21
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(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" = 83025
 ORDER BY
"avatar_avatar"."primary" DESC, "avatar_avatar"."date_uploaded" DESC
 LIMIT
1
SELECT ••• FROM "avatar_avatar" WHERE "avatar_avatar"."user_id" = 83025 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]

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" = '980' 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" = '980' 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" = 175142
 LIMIT
21
SELECT ••• FROM "lego_setphoto" WHERE "lego_setphoto"."id" = 175142 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" = 335508
 LIMIT
21
SELECT ••• FROM "lego_baseset" WHERE "lego_baseset"."id" = 335508 LIMIT 21
2 similar queries. Duplicated 2 times.
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(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" = 175142
 LIMIT
21
SELECT ••• FROM "lego_setphoto" WHERE "lego_setphoto"."id" = 175142 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()

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" = 335508
 LIMIT
21
SELECT ••• FROM "lego_baseset" WHERE "lego_baseset"."id" = 335508 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()

/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" = 776
 LIMIT
21
SELECT ••• FROM "lego_theme" WHERE "lego_theme"."id" = 776 LIMIT 21
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)

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" = 980)
 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" = 980) GROUP BY "taggit_tag"."id"
114.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(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:02.680784+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.680895+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 350 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.680762+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.681037+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:02.680784+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.680895+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 350 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.680762+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.681037+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
4 similar queries.
2.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(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:02.680784+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.680895+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 350 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.680762+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.681037+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:02.680784+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.680895+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 350 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.680762+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.681037+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US') ORDER BY 1 DESC, RANDOM() ASC LIMIT 1
4 similar queries.
1.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(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:02.691389+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.691454+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.691378+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.691572+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:02.691389+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.691454+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.691378+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.691572+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
4 similar queries.
1.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(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:02.691389+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.691454+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.691378+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.691572+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:02.691389+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.691454+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.691378+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.691572+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US') ORDER BY 1 DESC, RANDOM() ASC LIMIT 1
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(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:02.695799+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.695857+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.695790+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.695977+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:02.695799+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.695857+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.695790+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.695977+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
4 similar queries.
1.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(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:02.695799+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.695857+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.695790+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.695977+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:02.695799+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.695857+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.695790+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.695977+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US') ORDER BY 1 DESC, RANDOM() ASC LIMIT 1
4 similar queries.
1.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/./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:02.702837+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.702895+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.702828+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.703017+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:02.702837+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.702895+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.702828+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.703017+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
4 similar queries.
1.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/./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:02.702837+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.702895+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.702828+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.703017+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:02.702837+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:02.702895+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:02.702828+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:02.703017+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US') ORDER BY 1 DESC, RANDOM() ASC LIMIT 1
4 similar queries.
1.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/./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.