Django models 如何减少数据库查询的数量(Django、Wagtail、ParentalManytomy)

Django models 如何减少数据库查询的数量(Django、Wagtail、ParentalManytomy),django-models,django-orm,Django Models,Django Orm,我有这样一个db结构: from wagtail.core.models import Page from modelcluster.fields import ParentalManyToManyField class BookPage(Page): name = models.CharField(#settings) author = ParentalManyToManyField(CreatorPage, related_name="author_set&quo

我有这样一个db结构:

from wagtail.core.models import Page
from modelcluster.fields import ParentalManyToManyField

class BookPage(Page):
    name = models.CharField(#settings)
    author = ParentalManyToManyField(CreatorPage, related_name="author_set")
    illustrator = ParentalManyToManyField(CreatorPage, related_name="illustrator_set")

class CreatorPage(Page):
    name = # etc.
    slug = # etc.
在我的索引页上,我有一张所有书籍的表格,上面印有每个作者/插图画家。我一直在我的模板中使用
{%forbook.author.all%}
,但这意味着对每一行的数据库进行调用,这会变得非常昂贵

似乎与预回迁相关的应该可以工作,但是当我尝试加载页面时,我遇到了一个SQL错误

books = BookPage.objects.live().prefetch_related("author").prefetch_related("illustrator")
错误:

OperationalError at /books/
too many SQL variables
        
SQL查询示例:

SELECT ••• FROM "books_creatorpage" INNER JOIN "books_bookpage_composer" ON ("books_creatorpage"."page_ptr_id" = "books_showpage_composer"."creatorpage_id") INNER JOIN "wagtailcore_page" ON ("books_creatorpage"."page_ptr_id" = "wagtailcore_page"."id") WHERE "books_showpage_composer"."showpage_id" IN ('3294', '95', '99', '102', '105', '108', '116', '118', '126', '129', '131', '139', '145', '149', '152', '156', '894', '900', '1029', '1073', '1088', '1095', '1102', '1131', '1169', '1260', '1267', '1352', '1501', '1625', '1633', '1710', '1727', '1773', '2032', '2131', '2133', '2241', '2315', '2413', '2424', '2745', '2996', '3059', '3115', '3116', '3117', '3118', '3215', '3231', '162', '163', '164', '168', '171', '174', '176', '178', '187', '195', '191', '203', '205', '209', '206', '215', '218', '220', '222', '224', '229', '233', '236', '240', '243', '247', '249', '252', '256', '260', '266', '269', '272', '275', '263', '55', '279', '282', '284', '287', '288', '289', '293', '296', '301', '309', '321', '311', '326', '315', '323', '333', '305', '318', '414', '441', '1466', '1467', '337', '338', '339', '342', '349', '352', '360', '357', '365', '370', '375', '379', '384', '387', '390', '391', '80', '395', '398', '401', '404', '417', '428', '431', '436', '438', '445', '447', '56', '451', '453', '460', '457', '456', '467', '471', '472', '475', '477', '480', '483', '486', '488', '492', '495', '498', '501', '512', '515', '520', '527', '532', '536', '541', '544', '546', '552', '557', '555', '561', '563', '567', '574', '578', '576', '581', '582', '585', '590', '597', '596', '602', '610', '611', '615', '619', '625', '628', '632', '634', '636', '653', '654', '655', '659', '663', '665', '670', '674', '683', '689', '687', '696', '700', '705', '706', '708', '713', '714', '715', '725', '727', '730', '734', '736', '737', '741', '746', '749', '760', '761', '762', '770', '774', '777', '779', '782', '786', '788', '791', '796', '800', '802', '818', '819', '829', '830', '833', '837', '838', '845', '853', '860', '864', '867', '871', '878', '873', '881', '882', '888', '890', '897', '903', '906', '907', '911', '912', '916', '919', '921', '923', '930', '931', '928', '933', '934', '936', '938', '940', '945', '946', '947', '949', '952', '959', '963', '976', '978', '986', '988', '991', '995', '998', '1002', '1003', '1006', '1007', '1011', '1015', '1020', '1024', '1032', '1033', '1036', '1038', '1043', '1046', '1048', '1054', '1056', '1058', '1060', '1062', '1065', '1070', '1074', '1089', '1093', '1106', '1109', '1113', '1115', '1118', '1121', '1124', '1126', '1134', '1137', '1139', '1142', '1143', '1146', '1152', '1154', '1156', '1164', '1167', '57', '1168', '1173', '1174', '1177', '1180', '81', '1184', '1194', '1197', '1198', '1200', '1205', '1206', '1210', '1215', '1219', '1224', '1226', '82', '1229', '1233', '1236', '1238', '1242', '1246', '1247', '1249', '1251', '1252', '1258', '1263', '1270', '1272', '1275', '1276', '1277', '1281', '1283', '1285', '1287', '1310', '1351', '2088', '1312', '1315', '1317', '1320', '1321', '1324', '1333', '1334', '1336', '1338', '1342', '1346', '1344', '1348', '1356', '1357', '1354', '1359', '1364', '1371', '1369', '1372', '1374', '1376', '1379', '1382', '1388', '1393', '1397', '1401', '1405', '1408', '1411', '1416', '1418', '1420', '1425', '970', '1426', '1429', '1432', '1434', '1439', '1443', '1444', '1450', '1453', '1460', '1457', '1464', '1465', '1468', '1470', '1473', '1476', '1479', '1481', '1486', '1487', '1491', '1488', '1493', '1494', '1498', '1504', '1507', '1512', '1513', '1519', '1521', '1523', '1524', '1526', '1530', '1534', '1538', '1539', '1542', '1548', '1552', '1554', '1557', '1559', '1562', '1567', '1568', '1571', '1574', '1576', '1579', '1580', '1582', '1583', '1590', '1594', '1598', '1601', '1602', '1603', '1604', '1611', '1614', '1616', '1617', '1620', '1622', '1624', '1627', '1636', '1640', '1643', '1646', '1649', '1652', '1653', '1655', '1665', '1671', '1673', '1676', '1682', '1683', '1688', '1691', '1695', '1698', '1700', '1706', '1709', '1717', '1722', '1730', '1732', '1733', '1734', '1737', '1740', '1741', '1743', '1745', '1746', '1748', '1750', '1751', '1752', '83', '1754', '1756', '1758', '1759', '1761', '1765', '1768', '1771', '1778', '1781', '1786', '1789', '1790', '1794', '69', '70', '71', '72', '73', '74', '75', '1796', '1798', '1800', '1803', '1805', '1808', '1810', '1813', '1812', '1816', '1818', '1823', '1826', '1829', '1830', '1832', '1833', '1835', '1836', '1842', '1845', '1848', '1852', '1860', '1861', '1864', '1867', '1868', '1872', '1873', '1876', '1878', '1879', '1882', '1883', '1887', '1889', '1893', '1899', '1901', '1905', '1906', '1908', '1912', '1913', '1917', '1920', '1922', '1928', '1931', '1933', '1936', '1940', '1943', '1944', '1946', '1947', '1949', '1952', '1954', '1955', '1958', '1959', '1962', '1963', '1964', '1965', '1967', '1970', '1973', '1975', '1978', '1980', '1982', '1983', '1985', '1988', '1989', '84', '1991', '1994', '1995', '1998', '1996', '1999', '2001', '2003', '2009', '76', '2012', '85', '2014', '2017', '2020', '2021', '2022', '2024', '2028', '2029', '2031', '2034', '640', '942', '2624', '2698', '2036', '2039', '2040', '2200', '2058', '2593', '2726', '2061', '2063', '2065', '2067', '2069', '2072', '2075', '2076', '1329', '2317', '2318', '2319', '2078', '2082', '2084', '2087', '2112', '2090', '2100', '2119', '2120', '2123', '2124', '2126', '2127', '2129', '2134', '2137', '2141', '2145', '2147', '2149', '2152', '2155', '2157', '2160', '2168', '2171', '2172', '2173', '2176', '2177', '2178', '2182', '2184', '58', '2185', '2187', '2189', '2190', '2193', '2197', '2198', '86', '2201', '2208', '2212', '2216', '2221', '2222', '2225', '2232', '2226', '2229', '2240', '2245', '2250', '2251', '2253', '2254', '2255', '2256', '2259', '2263', '2265', '2267', '2268', '2273', '2276', '2284', '59', '2285', '2286', '2290', '2292', '2294', '60', '2297', '2298', '61', '2301', '2302', '62', '2304', '2306', '2312', '2320', '2322', '2323', '2326', '2329', '2331', '2333', '2334', '2337', '2338', '2340', '2341', '2345', '2348', '2349', '2352', '2356', '2360', '2361', '63', '2363', '2366', '2371', '2375', '2376', '2378', '2379', '2382', '2384', '2387', '2389', '2393', '2397', '2399', '2401', '2404', '2405', '2408', '2410', '2412', '2414', '2415', '2417', '2419', '2420', '2421', '2426', '2427', '2428', '2430', '2433', '2437', '2441', '2442', '2444', '2447', '2451', '2453', '2455', '2458', '2461', '2465', '2468', '2469', '2473', '2480', '2476', '2483', '2484', '2487', '2492', '2493', '2497', '2498', '2501', '2502', '2505', '2506', '2507', '2508', '2512', '2513', '2517', '2518', '2522', '2524', '2528', '2531', '2534', '2535', '2537', '87', '2539', '2541', '2543', '2544', '2545', '2546', '2547', '2551', '2552', '2553', '2558', '2563', '2566', '2569', '2571', '2572', '2578', '2579', '2586', '77', '2588', '2590', '2591', '2595', '2604', '2606', '2607', '2608', '2609', '2611', '2616', '2617', '2619', '2625', '2627', '2631', '2635', '2636', '2638', '2646', '2649', '2650', '2652', '2656', '2657', '2659', '2660', '2663', '2667', '2668', '2669', '2670', '2674', '2676', '2677', '2682', '2684', '2687', '2689', '2691', '2693', '2695', '2700', '2702', '78', '79', '2705', '2706', '2711', '2712', '2716', '2717', '2719', '2720', '2721', '2722', '2730', '2731', '2733', '88', '2734', '2737', '2739', '2743', '2746', '2748', '2749', '2750', '2751', '2752', '2755', '2757', '2760', '2762', '2767', '2769', '2772', '2774', '2777', '2779', '2780', '2787', '2792', '2793', '2794', '2796', '2799', '2800', '2805', '2807', '2808', '2810', '2812', '2820', '2823', '2824', '2826', '2827', '2829', '2830', '2831', '2832', '2834', '2837', '2840', '2843', '2847', '2848', '2851', '2853', '2855', '2858', '2862', '2865', '2874', '2875', '2880', '2884', '2885', '2886', '2890', '2891', '2893', '2896', '2898', '2901', '2905', '2910', '2915', '2916', '2919', '2923', '2926', '2927', '2929', '2931', '2933', '2934', '2937', '2938', '2940', '2941', '2942', '2946', '2947', '2953', '2954', '2955', '2961', '2962', '2965', '2966', '2971', '2972', '2973', '2974', '2978', '2980', '2987', '2988', '2990', '2992', '2994', '64', '2999', '3004', '65', '3008', '3011', '121', '180', '184', '198', '329', '408', '423', '434', '465', '504', '508', '523', '528', '535', '548', '571', '599', '605', '607', '623', '627', '645', '648', '678', '679', '695', '718', '720', '744', '753', '754', '755', '758', '768', '773', '784', '806', '810', '815', '821', '823', '826', '841', '846', '850', '856', '857', '869', '909', '927', '954', '966', '983', '1012', '1017', '1028', '1034', '1050', '1078', '1083', '1098', '1123', '1128', '1175', '1157', '1161', '1172', '1186', '1187', '1188', '1202', '1221', '1255', '1264', '1284', '1323', '1387', '1390', '1398', '1424', '1446', '1508', '1516', '1543', '1546', '1587', '1607', '1618', '1630', '1654', '1657', '1659', '1661', '1662', '1668', '1679', '1690', '1697', '1703', '1711', '1714', '1720', '1726', '1738', '1757', '1769', '1776', '1784', '1820', '1840', '1854', '1856', '1858', '1897', '2007', '2008', '2038', '2041', '2046', '2047', '2052', '2055', '2094', '2097', '2099', '2101', '2104', '2106', '2108', '2115', '2128', '2165', '2180', '2205', '2210', '2214', '2217', '2220', '2238', '2244', '2281', '2335', '2373', '2390', '2474', '2549', '2575', '2583', '2597', '2600', '2612', '2614', '2641', '2642', '2643', '2665', '2683', '2703', '2708', '2710', '2724', '2740', '2753', '2778', '2781', '2788', '2790', '2850', '2897', '2913', '2944', '2950', '2952', '2977', '3002', '3007', '3016', '3013', '3021', '3025', '3053', '3054', '3057', '3085', '3084', '3086', '3087', '3088', '3105', '3111', '3127', '3151', '3156', '3174', '3176', '3177', '3182', '3194', '3195', '3198', '3202', '3204', '3206', '3208', '3209', '3211', '3220', '3232', '3283', '3285', '3015', '3018', '3020', '3022', '3024', '3027', '3028', '3029', '3030', '89', '3034', '3036', '3037', '3038', '90', '3040', '3042', '3044', '3045', '3046', '3048', '3051', '3052', '3063', '3065', '91', '3070', '3071', '3072', '66', '3074', '3075', '3077', '67', '3080', '3081', '3083', '2998', '3090', '3095', '3098', '3102', '3108', '3114', '3119', '3122', '3125', '3126', '3130', '3133', '3135', '3137', '3138', '3141', '3142', '3145', '3147', '3149', '3154', '3157', '3159', '3162', '3163', '3166', '3168', '3171', '3173', '3175', '3180', '3181', '3187', '3189', '3190', '68', '3197', '3212', '3213', '3217', '3221', '3222', '3224', '3225', '3228', '3235', '3242', '3236', '3240', '3244', '3247', '3248', '3249', '3250', '3251', '3252', '3253', '3254', '3255', '3256', '3257', '3258', '3259', '3260', '3261', '3262', '3263', '3264', '3265', '3266', '3267', '3268', '3269', '3270', '3273', '3275', '3278', '3279', '3280', '3281', '3286', '3290', '3293') ORDER BY "wagtailcore_page"."path" ASC
这肯定是太多的变量了,但我不明白为什么这不起作用

我正在考虑将新字段放入模型中,以保存每个创建者所需的数据,然后重写save()方法,在对书籍的每次更改中更新此字段,但我希望一定有更好的方法来查询此字段,而不必执行这些额外的步骤