EDIT MODE

I love plants, but unfortunately am not very good at keeping them alive. This is part of the reason why LEGO botanicals sets appeal to me so much. Pretty looking plants that are not threatened by lapses in my memory and associated watering. However, for a few years now I have successfully been growing a few varieties of Pothos. I have golden (the stripy one), neon, and even one with some white streaks (harder to propagate), as well as a darker leafed heartleaf philodendron, which grows in a very similar way. Let's see how this set compares to the real deal.

Contents

The Set
The Parts
The Build
Conclusion

The Set

Relax and unwind as you build the LEGO® Botanicals Hanging Golden Pothos (11512) building set, a highly detailed interpretation of the popular house plant. This versatile display model can be crafted in 2 ways. For display on a shelf or corner nook, build it with 2 vines that hang past the bottom of the pot, or reassemble it with 4 identical vines to fit on a coffee table or countertop. All the leaves and stems are movable so nature lovers can customize their creation. The elegant white plant pot makes it a minimalist plant decor piece for a home office, living room or bedroom. This craft kit makes a lovely gift idea for women, men and nature lovers on birthdays, holidays, housewarmings and other special occasions. And, with the LEGO builder app, you can zoom and rotate your projects in 3D and track your progress. Set contains 372 pieces.

£54.99, $59.99, €59.99 / AUD$99.99

The Box

The box measured 280mm x 260mm x 58mm and weighs 0.57kg. Inside are 4 paper bags numbered 1 to 4, and the loose instructions.

 

The Instructions

The Australian version of the instruction manuals measures 195mm x 175mm x 2mm. It has 86 pages and 73 or 51 steps depending on the option you build (splitting after 33). There are a couple of pages giving information about the plant. 

 

 

The Parts

The set contains 372 parts and 4 spares, in 14 colors, and 19 part categories, with a total of 52 unique parts/color combinations.

Main colors are:

Main categories are:

 

New Parts

New Colors

Rare Colors and Prints

A few new green parts, just a bit of a shame more of the leaves weren't the stripy one. More than half are plain.

The Build

The base helps to give the pot a bit of height for the draping low hanging leaves. There are tyres on the bottom to help keep it in place.

The pot uses some interesting techniques to get a large round shape with minimal gaps. There is an axle stack in the middle to help join to the base, and also stop the dirt from sagging.

The dirt puddle has a lot of bars to join vines to. There are some gaps around the edges, but it looks fine once inserted in the pot and surrounded by plants. Our first group of leaves are attached before we get to choose which version to build. I wanted to build the asymetrical one, which works better if you have a long shelf to dangle it from.

This meant the vines I was working on were longer. Due to the hinge part being used, they can only bend in one direction. A few different parts are used to attach the leaves, giving it enough small differences to look organic.

It already looks pretty good with just this vine, which closely resembles my real plants (I don't often double pot them). But we still have more to go! The rest of the vines come together in similar ways. 1 more long one, then a couple of shorter ones.

 

Conclusion

Done! It isn't a huge set, so it comes together pretty quick. I think the white pot is a good colour choice and contrasts nicely with the leaves. The leaves look good, but are a bit small, at least compared to my pothos (which might not be representative). It would have been nice to have a few more variegated leaves than plain ones. They included just enough for it to not look weird, but my variegated vines have variegation on every leaf.

I'm not sure if I like the studs on the outside of the pot as some sort of textured detail, or if it would have been nicer to find a smooth solution.

It is 16c per part, which is a bit on the high side. This might be because of all the leaves, but there are a lot of smaller hinge parts too.

This set delivers as expected. If you like plants and want a LEGO pothos, this set is for you. It won't need any watering, or pruning, and can be altered to fit almost any shelf with the different lengthed vines.

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 icedragonj (© 2026 Rebrickable)

 

RebrickMat - LEGO Building Mat

In this review:

Hanging Golden Pothos
11512-1
(372 parts)
Botanicals 2026
LEGO® Icons Land Rover Classic Defender 90
DJDT

Time

Resource usage

Resource Value
User CPU time 252.363 msec
System CPU time 8.509 msec
Total CPU time 260.872 msec
Elapsed time 1272.149 msec
Context switches 190 voluntary, 9 involuntary

Browser timing

Timing attribute Timeline Milliseconds since navigation start (+length)

SQL queries from 1 connection

  • default 1010.32 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" = 971)
 LIMIT
21
SELECT ••• FROM "blog_article" WHERE ("blog_article"."is_active" AND "blog_article"."id" = 971) LIMIT 21
9 similar queries.
0.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(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: 11512-1 Hanging Golden Pothos') + SIMILARITY("blog_article"."body", 'I love plants, but unfortunately am not very good at keeping them alive. This is part of the reason why LEGO botanicals sets appeal to me so much. Pretty looking plants that are not threatened by lapses in my memory and associated watering. However, for a few years now I have successfully been growing a few varieties of Pothos. I have golden (the stripy one), neon, and even one with some white streaks (harder to propagate), as well as a darker leafed heartleaf philodendron, which grows in a very similar way. Let''s see how this set compares to the real deal. Contents The SetThe PartsThe BuildConclusion The Set Relax and unwind as you build the LEGO® Botanicals Hanging Golden Pothos (11512) building set, a highly detailed interpretation of the popular house plant. This versatile display model can be crafted in 2 ways. For display on a shelf or corner nook, build it with 2 vines that hang past the bottom of the pot, or reassemble it with 4 identical vines to fit on a coffee table or countertop. All the leaves and stems are movable so nature lovers can customize their creation. The elegant white plant pot makes it a minimalist plant decor piece for a home office, living room or bedroom. This craft kit makes a lovely gift idea for women, men and nature lovers on birthdays, holidays, housewarmings and other special occasions. And, with the LEGO builder app, you can zoom and rotate your projects in 3D and track your progress. Set contains 372 pieces. £54.99, $59.99, €59.99 / AUD$99.99 The Box The box measured 280mm x 260mm x 58mm and weighs 0.57kg. Inside are 4 paper bags numbered 1 to 4, and the loose instructions.   The Instructions The Australian version of the instruction manuals measures 195mm x 175mm x 2mm. It has 86 pages and 73 or 51 steps depending on the option you build (splitting after 33). There are a couple of pages giving information about the plant.      The Parts The set contains 372 parts and 4 spares, in 14 colors, and 19 part categories, with a total of 52 unique parts/color combinations.Main colors are: Reddish Brown: 13 unique parts, 63 quantity. Bright Green: 9 unique parts, 112 quantity. White: 8 unique parts, 76 quantity. Main categories are: Plates Round Curved and Dishes: 8 unique parts, 20 quantity. Bricks Round and Cones: 6 unique parts, 37 quantity. Plates Special: 4 unique parts, 25 quantity.   New Parts 8034Brick Round, Sloped 6 x 6 x 2 / 3 Corner New Colors 40379Animal Body Part / Plant, Tail / Claw / Horn / Branch / Tentacle, End SectionBright Green 7052Bar, Curved U-Shape 2 x 3Bright Green 54662Hinge Cylinder 1 x 3 Locking with 1 Finger and 2 Fingers On Ends, with Hole, 7 TeethBright Green 7096pat0002Plant, Leaf/Petal 4 x 6 x 1 1 / 3 with Marbled Lime PatternBright Green Rare Colors and Prints 53923Hinge Cylinder 1 x 2 Locking with 1 Finger and Axle Hole On Ends [No Side Slots]Bright Green A few new green parts, just a bit of a shame more of the leaves weren''t the stripy one. More than half are plain. The Build The base helps to give the pot a bit of height for the draping low hanging leaves. There are tyres on the bottom to help keep it in place. The pot uses some interesting techniques to get a large round shape with minimal gaps. There is an axle stack in the middle to help join to the base, and also stop the dirt from sagging. ')) 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:04.564748+00:00'::timestamptz AND NOT ("blog_article"."id" = 971))
 ORDER BY
19 DESC, "blog_article"."published_date" DESC
 LIMIT
15
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: 11512-1 Hanging Golden Pothos') + SIMILARITY("blog_article"."body", 'I love plants, but unfortunately am not very good at keeping them alive. This is part of the reason why LEGO botanicals sets appeal to me so much. Pretty looking plants that are not threatened by lapses in my memory and associated watering. However, for a few years now I have successfully been growing a few varieties of Pothos. I have golden (the stripy one), neon, and even one with some white streaks (harder to propagate), as well as a darker leafed heartleaf philodendron, which grows in a very similar way. Let''s see how this set compares to the real deal. Contents The SetThe PartsThe BuildConclusion The Set Relax and unwind as you build the LEGO® Botanicals Hanging Golden Pothos (11512) building set, a highly detailed interpretation of the popular house plant. This versatile display model can be crafted in 2 ways. For display on a shelf or corner nook, build it with 2 vines that hang past the bottom of the pot, or reassemble it with 4 identical vines to fit on a coffee table or countertop. All the leaves and stems are movable so nature lovers can customize their creation. The elegant white plant pot makes it a minimalist plant decor piece for a home office, living room or bedroom. This craft kit makes a lovely gift idea for women, men and nature lovers on birthdays, holidays, housewarmings and other special occasions. And, with the LEGO builder app, you can zoom and rotate your projects in 3D and track your progress. Set contains 372 pieces. £54.99, $59.99, €59.99 / AUD$99.99 The Box The box measured 280mm x 260mm x 58mm and weighs 0.57kg. Inside are 4 paper bags numbered 1 to 4, and the loose instructions.   The Instructions The Australian version of the instruction manuals measures 195mm x 175mm x 2mm. It has 86 pages and 73 or 51 steps depending on the option you build (splitting after 33). There are a couple of pages giving information about the plant.      The Parts The set contains 372 parts and 4 spares, in 14 colors, and 19 part categories, with a total of 52 unique parts/color combinations.Main colors are: Reddish Brown: 13 unique parts, 63 quantity. Bright Green: 9 unique parts, 112 quantity. White: 8 unique parts, 76 quantity. Main categories are: Plates Round Curved and Dishes: 8 unique parts, 20 quantity. Bricks Round and Cones: 6 unique parts, 37 quantity. Plates Special: 4 unique parts, 25 quantity.   New Parts 8034Brick Round, Sloped 6 x 6 x 2 / 3 Corner New Colors 40379Animal Body Part / Plant, Tail / Claw / Horn / Branch / Tentacle, End SectionBright Green 7052Bar, Curved U-Shape 2 x 3Bright Green 54662Hinge Cylinder 1 x 3 Locking with 1 Finger and 2 Fingers On Ends, with Hole, 7 TeethBright Green 7096pat0002Plant, Leaf/Petal 4 x 6 x 1 1 / 3 with Marbled Lime PatternBright Green Rare Colors and Prints 53923Hinge Cylinder 1 x 2 Locking with 1 Finger and Axle Hole On Ends [No Side Slots]Bright Green A few new green parts, just a bit of a shame more of the leaves weren''t the stripy one. More than half are plain. The Build The base helps to give the pot a bit of height for the draping low hanging leaves. There are tyres on the bottom to help keep it in place. The pot uses some interesting techniques to get a large round shape with minimal gaps. There is an axle stack in the middle to help join to the base, and also stop the dirt from sagging. ')) 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:04.564748+00:00'::timestamptz AND NOT ("blog_article"."id" = 971)) ORDER BY 19 DESC, "blog_article"."published_date" DESC LIMIT 15
894.78

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:05.462586+00:00'::timestamptz)
 ORDER BY
"blog_articlestats"."hits" DESC
 LIMIT
15
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:05.462586+00:00'::timestamptz) ORDER BY "blog_articlestats"."hits" DESC LIMIT 15
2.73

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

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

Connection: default

Transaction status: Idle

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

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

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

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

/home/nathan/rb/site/./blog/views.py in get_series(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.27

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

Connection: default

Transaction status: Idle

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

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

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

/home/nathan/rb/site/./blog/views.py in cached_blog_article(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.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('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.
3.84

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

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

Connection: default

Transaction status: Idle

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

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

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

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

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

SELECT COUNT(*) AS "__count"
  FROM
"blog_article"
 INNER JOIN
"taggit_taggeditem"
    ON
("blog_article"."id" = "taggit_taggeditem"."object_id" AND ("taggit_taggeditem"."content_type_id" = 12))
 INNER JOIN
"taggit_tag"
    ON
("taggit_taggeditem"."tag_id" = "taggit_tag"."id")
 WHERE
("blog_article"."is_active" AND UPPER("taggit_tag"."slug"::text) = UPPER('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.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(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.73

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

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-30T00:00:00.072837+00:00'::timestamptz AND "blog_article"."id" > 971) OR "blog_article"."published_date" > '2026-10-30T00:00:00.072837+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-30T00:00:00.072837+00:00'::timestamptz AND "blog_article"."id" > 971) OR "blog_article"."published_date" > '2026-10-30T00:00:00.072837+00:00'::timestamptz)) ORDER BY "blog_article"."published_date" ASC, "blog_article"."id" ASC LIMIT 1
0.26

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-30T00:00:00.072837+00:00'::timestamptz AND "blog_article"."id" < 971) OR "blog_article"."published_date" < '2026-10-30T00:00:00.072837+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-30T00:00:00.072837+00:00'::timestamptz AND "blog_article"."id" < 971) OR "blog_article"."published_date" < '2026-10-30T00:00:00.072837+00:00'::timestamptz)) ORDER BY "blog_article"."published_date" DESC, "blog_article"."id" DESC LIMIT 1
0.50

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" = '11512-1'
 LIMIT
21
SELECT ••• FROM "lego_baseset" WHERE "lego_baseset"."set_num" = '11512-1' LIMIT 21
8.57

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" = '11512-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" = '11512-1') LIMIT 21
0.66

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 (340765))
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 (340765))
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(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" = 340765 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" = 340765 AND "lego_storesetitem"."store_id" IN (SELECT ••• FROM "lego_store" U0 WHERE (U0."is_active" AND UPPER(U0."store_url"::text) LIKE UPPER('%linksynergy.com%'))))
2.15

Connection: default

Transaction status: Idle

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

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

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

/home/nathan/rb/site/./blog/views.py in cached_blog_article(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" = '11512-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" = '11512-1') LIMIT 21
0.58

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

Connection: default

Transaction status: Idle

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

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

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

/home/nathan/rb/site/./blog/views.py in cached_blog_article(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.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(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.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)

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" = 'icedragonj'
 LIMIT
21
SELECT ••• FROM "auth_user" WHERE "auth_user"."username" = 'icedragonj' 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" = 159879
 ORDER BY
"avatar_avatar"."primary" DESC, "avatar_avatar"."date_uploaded" DESC
 LIMIT
1
SELECT ••• FROM "avatar_avatar" WHERE "avatar_avatar"."user_id" = 159879 ORDER BY "avatar_avatar"."primary" DESC, "avatar_avatar"."date_uploaded" DESC LIMIT 1
2 similar queries. Duplicated 2 times.
0.10

Connection: default

Transaction status: Idle

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

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

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

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

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

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

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

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

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

SELECT COUNT(*) AS "__count"
  FROM
"threadedcomments_comment"
 INNER JOIN
"django_comments"
    ON
("threadedcomments_comment"."comment_ptr_id" = "django_comments"."id")
 WHERE
("django_comments"."content_type_id" = 12 AND "django_comments"."object_pk" = '971' 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" = '971' AND "django_comments"."site_id" = 1 AND "django_comments"."is_public" AND NOT "django_comments"."is_removed")
2 similar queries. Duplicated 2 times.
1.07

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" = 971
 LIMIT
21
SELECT ••• FROM "blog_articlestats" WHERE "blog_articlestats"."article_id" = 971 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" = 'icedragonj'
 LIMIT
21
SELECT ••• FROM "auth_user" WHERE "auth_user"."username" = 'icedragonj' LIMIT 21
2 similar queries. Duplicated 2 times.
0.09

Connection: default

Transaction status: Idle

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

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

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

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

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

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

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

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

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" = 159879
 ORDER BY
"avatar_avatar"."primary" DESC, "avatar_avatar"."date_uploaded" DESC
 LIMIT
1
SELECT ••• FROM "avatar_avatar" WHERE "avatar_avatar"."user_id" = 159879 ORDER BY "avatar_avatar"."primary" DESC, "avatar_avatar"."date_uploaded" DESC LIMIT 1
2 similar queries. Duplicated 2 times.
0.08

Connection: default

Transaction status: Idle

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

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

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

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

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

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

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

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

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

SELECT COUNT(*) AS "__count"
  FROM
"threadedcomments_comment"
 INNER JOIN
"django_comments"
    ON
("threadedcomments_comment"."comment_ptr_id" = "django_comments"."id")
 WHERE
("django_comments"."content_type_id" = 12 AND "django_comments"."object_pk" = '971' 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" = '971' AND "django_comments"."site_id" = 1 AND "django_comments"."is_public" AND NOT "django_comments"."is_removed")
2 similar queries. Duplicated 2 times.
0.18

Connection: default

Transaction status: Idle

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

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

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

/home/nathan/rb/site/./blog/views.py in cached_blog_article(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" = 176940
 LIMIT
21
SELECT ••• FROM "lego_setphoto" WHERE "lego_setphoto"."id" = 176940 LIMIT 21
2 similar queries. Duplicated 2 times.
0.09

Connection: default

Transaction status: Idle

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

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

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

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

/home/nathan/rb/site/./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" = 340765
 LIMIT
21
SELECT ••• FROM "lego_baseset" WHERE "lego_baseset"."id" = 340765 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')

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

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

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" = 769
 LIMIT
21
SELECT ••• FROM "lego_theme" WHERE "lego_theme"."id" = 769 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" = 971)
 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" = 971) GROUP BY "taggit_tag"."id"
61.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)

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:05.619632+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.619760+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 350 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.619605+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.619897+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:05.619632+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.619760+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 350 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.619605+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.619897+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
4 similar queries.
2.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(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:05.619632+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.619760+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 350 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.619605+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.619897+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:05.619632+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.619760+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 350 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.619605+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.619897+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US') ORDER BY 1 DESC, RANDOM() ASC LIMIT 1
4 similar queries.
1.26

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:05.630701+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.630788+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.630685+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.630968+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:05.630701+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.630788+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.630685+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.630968+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
4 similar queries.
1.34

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:05.630701+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.630788+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.630685+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.630968+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:05.630701+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.630788+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.630685+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.630968+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US') ORDER BY 1 DESC, RANDOM() ASC LIMIT 1
4 similar queries.
1.22

Connection: default

Transaction status: Idle

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

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

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

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

/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:05.635662+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.635724+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.635653+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.635876+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:05.635662+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.635724+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.635653+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.635876+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:

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:05.635662+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.635724+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.635653+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.635876+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:05.635662+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.635724+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.635653+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.635876+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US') ORDER BY 1 DESC, RANDOM() ASC LIMIT 1
4 similar queries.
1.08

Connection: default

Transaction status: Idle

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

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

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

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

/home/nathan/rb/site/./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:05.641930+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.641995+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.641921+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.642110+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
SELECT ••• FROM "ads_banner" WHERE ("ads_banner"."start_date" < '2026-11-15T23:51:05.641930+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.641995+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.641921+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.642110+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US')
4 similar queries.
1.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(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:05.641930+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.641995+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.641921+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.642110+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:05.641930+00:00'::timestamptz AND ("ads_banner"."end_date" > '2026-11-15T23:51:05.641995+00:00'::timestamptz OR "ads_banner"."end_date" IS NULL) AND "ads_banner"."height" <= 600 AND "ads_banner"."start_date" < '2026-11-15T23:51:05.641921+00:00'::timestamptz AND "ads_banner"."width" <= 262 AND ("ads_banner"."end_date" IS NULL OR "ads_banner"."end_date" > '2026-11-15T23:51:05.642110+00:00'::timestamptz) AND "ads_banner"."country_code" = 'US') ORDER BY 1 DESC, RANDOM() ASC LIMIT 1
4 similar queries.
1.11

Connection: default

Transaction status: Idle

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

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

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

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

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

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.