@@ -1283,6 +1283,7 @@ def get_entities_in_container(
12831283 container : Container ,
12841284 * ,
12851285 published : bool ,
1286+ select_related_version : str | None = None ,
12861287) -> list [ContainerEntityListEntry ]:
12871288 """
12881289 [ 🛑 UNSTABLE ]
@@ -1293,14 +1294,35 @@ def get_entities_in_container(
12931294 container: The Container, e.g. returned by `get_container()`
12941295 published: `True` if we want the published version of the container, or
12951296 `False` for the draft version.
1297+ select_related_version: An optional optimization; specify a relationship
1298+ on ContainerVersion, like `componentversion` or `containerversion__x`
1299+ to preload via select_related.
12961300 """
12971301 assert isinstance (container , Container )
1298- container_version = container .versioning .published if published else container .versioning .draft
1302+ if published :
1303+ # Very minor optimization: reload the container with related 1:1 entities
1304+ container = Container .objects .select_related (
1305+ "publishable_entity__published__version__containerversion__entity_list" ).get (pk = container .pk )
1306+ container_version = container .versioning .published
1307+ select_related = ["entity__published__version" ]
1308+ if select_related_version :
1309+ select_related .append (f"entity__published__version__{ select_related_version } " )
1310+ else :
1311+ # Very minor optimization: reload the container with related 1:1 entities
1312+ container = Container .objects .select_related (
1313+ "publishable_entity__draft__version__containerversion__entity_list" ).get (pk = container .pk )
1314+ container_version = container .versioning .draft
1315+ select_related = ["entity__draft__version" ]
1316+ if select_related_version :
1317+ select_related .append (f"entity__draft__version__{ select_related_version } " )
12991318 if container_version is None :
13001319 raise ContainerVersion .DoesNotExist # This container has not been published yet, or has been deleted.
13011320 assert isinstance (container_version , ContainerVersion )
1302- entity_list = []
1303- for row in container_version .entity_list .entitylistrow_set .order_by ("order_num" ):
1321+ entity_list : list [ContainerEntityListEntry ] = []
1322+ for row in container_version .entity_list .entitylistrow_set .select_related (
1323+ "entity_version" ,
1324+ * select_related ,
1325+ ).order_by ("order_num" ):
13041326 entity_version = row .entity_version # This will be set if pinned
13051327 if not entity_version : # If this entity is "unpinned", use the latest published/draft version:
13061328 entity_version = row .entity .published .version if published else row .entity .draft .version
@@ -1393,7 +1415,10 @@ def get_containers_with_entity(
13931415 qs = Container .objects .filter (
13941416 publishable_entity__draft__version__containerversion__entity_list__entitylistrow__entity_id = publishable_entity_pk , # pylint: disable=line-too-long # noqa: E501
13951417 )
1396- return qs .order_by ("pk" ).distinct () # Ordering is mostly for consistent test cases.
1418+ return qs .select_related (
1419+ "publishable_entity__draft__version__containerversion" ,
1420+ "publishable_entity__published__version__containerversion" ,
1421+ ).order_by ("pk" ).distinct () # Ordering is mostly for consistent test cases.
13971422
13981423
13991424def get_container_children_count (
0 commit comments