{"id":"8440889c-fab6-406e-bf4c-418f229e61e7","shortId":"UTUhkm","kind":"skill","title":"django-perf-review","tagline":"Django performance code review. Use when asked to \"review Django performance\", \"find N+1 queries\", \"optimize Django\", \"check queryset performance\", \"database performance\", \"Django ORM issues\", or audit Django code for performance problems.","description":"# Django Performance Review\n\nReview Django code for **validated** performance issues. Research the codebase to confirm issues before reporting. Report only what you can prove.\n\n## When to Use\n- You need a Django performance review focused on verified ORM and query issues.\n- The code likely has N+1 queries, unbounded querysets, missing indexes, or other database-driven bottlenecks.\n- You want only provable performance findings, not speculative optimization advice.\n\n## Review Approach\n\n1. **Research first** - Trace data flow, check for existing optimizations, verify data volume\n2. **Validate before reporting** - Pattern matching is not validation\n3. **Zero findings is acceptable** - Don't manufacture issues to appear thorough\n4. **Severity must match impact** - If you catch yourself writing \"minor\" in a CRITICAL finding, it's not critical. Downgrade or skip it.\n\n## Impact Categories\n\nIssues are organized by impact. Focus on CRITICAL and HIGH - these cause real problems at scale.\n\n| Priority | Category | Impact |\n|----------|----------|--------|\n| 1 | N+1 Queries | **CRITICAL** - Multiplies with data, causes timeouts |\n| 2 | Unbounded Querysets | **CRITICAL** - Memory exhaustion, OOM kills |\n| 3 | Missing Indexes | **HIGH** - Full table scans on large tables |\n| 4 | Write Loops | **HIGH** - Lock contention, slow requests |\n| 5 | Inefficient Patterns | **LOW** - Rarely worth reporting |\n\n---\n\n## Priority 1: N+1 Queries (CRITICAL)\n\n**Impact:** Each N+1 adds `O(n)` database round trips. 100 rows = 100 extra queries. 10,000 rows = timeout.\n\n### Rule: Prefetch related data accessed in loops\n\nValidate by tracing: View → Queryset → Template/Serializer → Loop access\n\n```python\n# PROBLEM: N+1 - each iteration queries profile\ndef user_list(request):\n    users = User.objects.all()\n    return render(request, 'users.html', {'users': users})\n\n# Template:\n# {% for user in users %}\n#     {{ user.profile.bio }}  ← triggers query per user\n# {% endfor %}\n\n# SOLUTION: Prefetch in view\ndef user_list(request):\n    users = User.objects.select_related('profile')\n    return render(request, 'users.html', {'users': users})\n```\n\n### Rule: Prefetch in serializers, not just views\n\nDRF serializers accessing related fields cause N+1 if queryset isn't optimized.\n\n```python\n# PROBLEM: SerializerMethodField queries per object\nclass UserSerializer(serializers.ModelSerializer):\n    order_count = serializers.SerializerMethodField()\n\n    def get_order_count(self, obj):\n        return obj.orders.count()  # ← query per user\n\n# SOLUTION: Annotate in viewset, access in serializer\nclass UserViewSet(viewsets.ModelViewSet):\n    def get_queryset(self):\n        return User.objects.annotate(order_count=Count('orders'))\n\nclass UserSerializer(serializers.ModelSerializer):\n    order_count = serializers.IntegerField(read_only=True)\n```\n\n### Rule: Model properties that query are dangerous in loops\n\n```python\n# PROBLEM: Property triggers query when accessed\nclass User(models.Model):\n    @property\n    def recent_orders(self):\n        return self.orders.filter(created__gte=last_week)[:5]\n\n# Used in template loop = N+1\n\n# SOLUTION: Use Prefetch with custom queryset, or annotate\n```\n\n### Validation Checklist for N+1\n- [ ] Traced data flow from view to template/serializer\n- [ ] Confirmed related field is accessed inside a loop\n- [ ] Searched codebase for existing select_related/prefetch_related\n- [ ] Verified table has significant row count (1000+)\n- [ ] Confirmed this is a hot path (not admin, not rare action)\n\n---\n\n## Priority 2: Unbounded Querysets (CRITICAL)\n\n**Impact:** Loading entire tables exhausts memory. Large tables cause OOM kills and worker restarts.\n\n### Rule: Always paginate list endpoints\n\n```python\n# PROBLEM: No pagination - loads all rows\nclass UserListView(ListView):\n    model = User\n    template_name = 'users.html'\n\n# SOLUTION: Add pagination\nclass UserListView(ListView):\n    model = User\n    template_name = 'users.html'\n    paginate_by = 25\n```\n\n### Rule: Use iterator() for large batch processing\n\n```python\n# PROBLEM: Loads all objects into memory at once\nfor user in User.objects.all():\n    process(user)\n\n# SOLUTION: Stream with iterator()\nfor user in User.objects.iterator(chunk_size=1000):\n    process(user)\n```\n\n### Rule: Never call list() on unbounded querysets\n\n```python\n# PROBLEM: Forces full evaluation into memory\nall_users = list(User.objects.all())\n\n# SOLUTION: Keep as queryset, slice if needed\nusers = User.objects.all()[:100]\n```\n\n### Validation Checklist for Unbounded Querysets\n- [ ] Table is large (10k+ rows) or will grow unbounded\n- [ ] No pagination class, paginate_by, or slicing\n- [ ] This runs on user-facing request (not background job with chunking)\n\n---\n\n## Priority 3: Missing Indexes (HIGH)\n\n**Impact:** Full table scans. Negligible on small tables, catastrophic on large ones.\n\n### Rule: Index fields used in WHERE clauses on large tables\n\n```python\n# PROBLEM: Filtering on unindexed field\n# User.objects.filter(email=email)  # full scan if no index\n\nclass User(models.Model):\n    email = models.EmailField()  # ← no db_index\n\n# SOLUTION: Add index\nclass User(models.Model):\n    email = models.EmailField(db_index=True)\n```\n\n### Rule: Index fields used in ORDER BY on large tables\n\n```python\n# PROBLEM: Sorting requires full scan without index\nOrder.objects.order_by('-created')\n\n# SOLUTION: Index the sort field\nclass Order(models.Model):\n    created = models.DateTimeField(db_index=True)\n```\n\n### Rule: Use composite indexes for common query patterns\n\n```python\nclass Order(models.Model):\n    user = models.ForeignKey(User)\n    status = models.CharField(max_length=20)\n    created = models.DateTimeField()\n\n    class Meta:\n        indexes = [\n            models.Index(fields=['user', 'status']),  # for filter(user=x, status=y)\n            models.Index(fields=['status', '-created']),  # for filter(status=x).order_by('-created')\n        ]\n```\n\n### Validation Checklist for Missing Indexes\n- [ ] Table has 10k+ rows\n- [ ] Field is used in filter() or order_by() on hot path\n- [ ] Checked model - no db_index=True or Meta.indexes entry\n- [ ] Not a foreign key (already indexed automatically)\n\n---\n\n## Priority 4: Write Loops (HIGH)\n\n**Impact:** N database writes instead of 1. Lock contention. Slow requests.\n\n### Rule: Use bulk_create instead of create() in loops\n\n```python\n# PROBLEM: N inserts, N round trips\nfor item in items:\n    Model.objects.create(name=item['name'])\n\n# SOLUTION: Single bulk insert\nModel.objects.bulk_create([\n    Model(name=item['name']) for item in items\n])\n```\n\n### Rule: Use update() or bulk_update instead of save() in loops\n\n```python\n# PROBLEM: N updates\nfor obj in queryset:\n    obj.status = 'done'\n    obj.save()\n\n# SOLUTION A: Single UPDATE statement (same value for all)\nqueryset.update(status='done')\n\n# SOLUTION B: bulk_update (different values)\nfor obj in objects:\n    obj.status = compute_status(obj)\nModel.objects.bulk_update(objects, ['status'], batch_size=500)\n```\n\n### Rule: Use delete() on queryset, not in loops\n\n```python\n# PROBLEM: N deletes\nfor obj in queryset:\n    obj.delete()\n\n# SOLUTION: Single DELETE\nqueryset.delete()\n```\n\n### Validation Checklist for Write Loops\n- [ ] Loop iterates over 100+ items (or unbounded)\n- [ ] Each iteration calls create(), save(), or delete()\n- [ ] This runs on user-facing request (not one-time migration script)\n\n---\n\n## Priority 5: Inefficient Patterns (LOW)\n\n**Rarely worth reporting.** Include only as minor notes if you're already reporting real issues.\n\n### Pattern: count() vs exists()\n\n```python\n# Slightly suboptimal\nif queryset.count() > 0:\n    do_thing()\n\n# Marginally better\nif queryset.exists():\n    do_thing()\n```\n\n**Usually skip** - difference is <1ms in most cases.\n\n### Pattern: len(queryset) vs count()\n\n```python\n# Fetches all rows to count\nif len(queryset) > 0:  # bad if queryset not yet evaluated\n\n# Single COUNT query\nif queryset.count() > 0:\n```\n\n**Only flag** if queryset is large and not already evaluated.\n\n### Pattern: get() in small loops\n\n```python\n# N queries, but if N is small (< 20), often fine\nfor id in ids:\n    obj = Model.objects.get(id=id)\n```\n\n**Only flag** if loop is large or this is in a very hot path.\n\n---\n\n## Validation Requirements\n\nBefore reporting ANY issue:\n\n1. **Trace the data flow** - Follow queryset from creation to consumption\n2. **Search for existing optimizations** - Grep for select_related, prefetch_related, pagination\n3. **Verify data volume** - Check if table is actually large\n4. **Confirm hot path** - Trace call sites, verify this runs frequently\n5. **Rule out mitigations** - Check for caching, rate limiting\n\n**If you cannot validate all steps, do not report.**\n\n---\n\n## Output Format\n\n```markdown\n## Django Performance Review: [File/Component Name]\n\n### Summary\nValidated issues: X (Y Critical, Z High)\n\n### Findings\n\n#### [PERF-001] N+1 Query in UserListView (CRITICAL)\n**Location:** `views.py:45`\n\n**Issue:** Related field `profile` accessed in template loop without prefetch.\n\n**Validation:**\n- Traced: UserListView → users queryset → user_list.html → `{{ user.profile.bio }}` in loop\n- Searched codebase: no select_related('profile') found\n- User table: 50k+ rows (verified in admin)\n- Hot path: linked from homepage navigation\n\n**Evidence:**\n```python\ndef get_queryset(self):\n    return User.objects.filter(active=True)  # no select_related\n```\n\n**Fix:**\n```python\ndef get_queryset(self):\n    return User.objects.filter(active=True).select_related('profile')\n```\n```\n\nIf no issues found: \"No performance issues identified after reviewing [files] and validating [what you checked].\"\n\n**Before submitting, sanity check each finding:**\n- Does the severity match the actual impact? (\"Minor inefficiency\" ≠ CRITICAL)\n- Is this a real performance issue or just a style preference?\n- Would fixing this measurably improve performance?\n\nIf the answer to any is \"no\" - remove the finding.\n\n---\n\n## What NOT to Report\n\n- Test files\n- Admin-only views\n- Management commands\n- Migration files\n- One-time scripts\n- Code behind disabled feature flags\n- Tables with <1000 rows that won't grow\n- Patterns in cold paths (rarely executed code)\n- Micro-optimizations (exists vs count, only/defer without evidence)\n\n### False Positives to Avoid\n\n**Queryset variable assignment is not an issue:**\n```python\n# This is FINE - no performance difference\nprojects_qs = Project.objects.filter(org=org)\nprojects = list(projects_qs)\n\n# vs this - identical performance\nprojects = list(Project.objects.filter(org=org))\n```\nQuerysets are lazy. Assigning to a variable doesn't execute anything.\n\n**Single query patterns are not N+1:**\n```python\n# This is ONE query, not N+1\nprojects = list(Project.objects.filter(org=org))\n```\nN+1 requires a loop that triggers additional queries. A single `list()` call is fine.\n\n**Missing select_related on single object fetch is not N+1:**\n```python\n# This is 2 queries, not N+1 - report as LOW at most\nstate = AutofixState.objects.filter(pr_id=pr_id).first()\nproject_id = state.request.project_id  # second query\n```\nN+1 requires a loop. A single object doing 2 queries instead of 1 can be reported as LOW if relevant, but never as CRITICAL/HIGH.\n\n**Style preferences are not performance issues:**\nIf your only suggestion is \"combine these two lines\" or \"rename this variable\" - that's style, not performance. Don't report it.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["django","perf","review","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-django-perf-review","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/django-perf-review","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34831 github stars · SKILL.md body (11,672 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T06:51:04.948Z","embedding":null,"createdAt":"2026-04-18T21:36:12.192Z","updatedAt":"2026-04-24T06:51:04.948Z","lastSeenAt":"2026-04-24T06:51:04.948Z","tsv":"'+1':18,82,186,230,236,270,330,424,437,1173,1404,1412,1419,1443,1451,1471 '-001':1171 '0':993,1024,1036 '000':249 '1':106,184,228,813,1091,1483 '10':248 '100':243,245,592,940 '1000':465,562,1329 '10k':601,773 '1ms':1006 '2':119,194,478,1102,1447,1479 '20':739,1060 '25':529 '3':128,202,627,1114 '4':140,212,803,1124 '5':220,418,965,1135 '500':910 '50k':1208 'accept':132 'access':256,266,325,363,403,449,1184 'action':476 'activ':1227,1240 'actual':1122,1272 'add':237,517,676 'addit':1425 'admin':473,1212,1311 'admin-on':1310 'advic':103 'alreadi':799,980,1045 'alway':497 'annot':360,432 'answer':1296 'anyth':1397 'appear':138 'approach':105 'ask':11,1556 'assign':1357,1390 'audit':31 'autofixstate.objects.filter':1458 'automat':801 'avoid':1354 'b':891 'background':622 'bad':1025 'batch':535,908 'behind':1323 'better':997 'bottleneck':93 'boundari':1564 'bulk':820,844,860,892 'cach':1141 'call':567,946,1129,1430 'cannot':1146 'case':1009 'catastroph':639 'catch':147 'categori':164,182 'caus':176,192,328,490 'check':22,112,786,1118,1139,1260,1264 'checklist':434,594,767,933 'chunk':560,625 'clarif':1558 'class':342,366,379,404,508,519,609,667,678,712,729,742 'claus':649 'clear':1531 'code':7,33,42,78,1322,1341 'codebas':49,454,1200 'cold':1337 'combin':1506 'command':1315 'common':725 'composit':722 'comput':901 'confirm':51,445,466,1125 'consumpt':1101 'content':217,815 'count':346,351,376,377,383,464,985,1014,1020,1032,1347 'creat':414,706,715,740,758,765,821,824,847,947 'creation':1099 'criteria':1567 'critic':153,158,172,188,197,232,481,1166,1177,1276 'critical/high':1494 'custom':429 'danger':394 'data':110,117,191,255,439,1094,1116 'databas':25,91,240,809 'database-driven':90 'db':673,683,717,789 'def':275,302,348,369,408,1221,1234 'delet':913,922,930,950 'describ':1535 'differ':894,1004,1368 'disabl':1324 'django':2,5,14,21,27,32,37,41,67,1156 'django-perf-review':1 'doesn':1394 'done':876,889 'downgrad':159 'drf':323 'driven':92 'email':660,661,670,681 'endfor':297 'endpoint':500 'entir':484 'entri':794 'environ':1547 'environment-specif':1546 'evalu':576,1030,1046 'evid':1219,1350 'execut':1340,1396 'exhaust':199,486 'exist':114,456,987,1105,1345 'expert':1552 'extra':246 'face':619,956 'fals':1351 'featur':1325 'fetch':1016,1439 'field':327,447,645,658,688,711,746,756,775,1182 'file':1255,1309,1317 'file/component':1159 'filter':655,750,760,779 'find':16,99,130,154,1169,1266,1303 'fine':1062,1365,1432 'first':108,1463 'fix':1232,1289 'flag':1038,1072,1326 'flow':111,440,1095 'focus':70,170 'follow':1096 'forc':574 'foreign':797 'format':1154 'found':1205,1248 'frequent':1134 'full':206,575,632,662,700 'get':349,370,1048,1222,1235 'grep':1107 'grow':605,1334 'gte':415 'high':174,205,215,630,806,1168 'homepag':1217 'hot':470,784,1083,1126,1213 'id':1064,1066,1069,1070,1460,1462,1465,1467 'ident':1380 'identifi':1252 'impact':144,163,169,183,233,482,631,807,1273 'improv':1292 'includ':972 'index':87,204,629,644,666,674,677,684,687,703,708,718,723,744,770,790,800 'ineffici':221,966,1275 'input':1561 'insert':830,845 'insid':450 'instead':811,822,862,1481 'isn':333 'issu':29,46,52,76,136,165,983,1090,1163,1180,1247,1251,1282,1361,1500 'item':835,837,840,850,853,855,941 'iter':272,532,555,938,945 'job':623 'keep':584 'key':798 'kill':201,492 'larg':210,488,534,600,641,651,694,1042,1076,1123 'last':416 'lazi':1389 'len':1011,1022 'length':738 'like':79 'limit':1143,1523 'line':1509 'link':1215 'list':277,304,499,568,581,1375,1383,1414,1429 'listview':510,521 'load':483,505,539 'locat':1178 'lock':216,814 'loop':214,258,265,396,422,452,805,826,866,918,936,937,1051,1074,1187,1198,1422,1474 'low':223,968,1454,1488 'manag':1314 'manufactur':135 'margin':996 'markdown':1155 'match':124,143,1270,1532 'max':737 'measur':1291 'memori':198,487,543,578 'meta':743 'meta.indexes':793 'micro':1343 'micro-optim':1342 'migrat':962,1316 'minor':150,975,1274 'miss':86,203,628,769,1433,1569 'mitig':1138 'model':389,511,522,787,848 'model.objects.bulk':846,904 'model.objects.create':838 'model.objects.get':1068 'models.charfield':736 'models.datetimefield':716,741 'models.emailfield':671,682 'models.foreignkey':733 'models.index':745,755 'models.model':406,669,680,714,731 'multipli':189 'must':142 'n':17,81,185,229,235,239,269,329,423,436,808,829,831,869,921,1053,1057,1172,1403,1411,1418,1442,1450,1470 'name':514,525,839,841,849,851,1160 'navig':1218 'need':65,589 'neglig':635 'never':566,1492 'note':976 'o':238 'obj':353,872,897,903,924,1067 'obj.delete':927 'obj.orders.count':355 'obj.save':877 'obj.status':875,900 'object':341,541,899,906,1438,1477 'often':1061 'one':642,960,1319,1408 'one-tim':959,1318 'only/defer':1348 'oom':200,491 'optim':20,102,115,335,1106,1344 'order':345,350,375,378,382,410,691,713,730,763,781 'order.objects.order':704 'org':1372,1373,1385,1386,1416,1417 'organ':167 'orm':28,73 'output':1153,1541 'pagin':498,504,518,527,608,610,1113 'path':471,785,1084,1127,1214,1338 'pattern':123,222,727,967,984,1010,1047,1335,1400 'per':295,340,357 'perf':3,1170 'perform':6,15,24,26,35,38,45,68,98,1157,1250,1281,1293,1367,1381,1499,1518 'permiss':1562 'posit':1352 'pr':1459,1461 'prefer':1287,1496 'prefetch':253,299,317,427,1111,1189 'prioriti':181,227,477,626,802,964 'problem':36,178,268,337,398,502,538,573,654,697,828,868,920 'process':536,550,563 'profil':274,309,1183,1204,1244 'project':1369,1374,1376,1382,1413,1464 'project.objects.filter':1371,1384,1415 'properti':390,399,407 'provabl':97 'prove':60 'python':267,336,397,501,537,572,653,696,728,827,867,919,988,1015,1052,1220,1233,1362,1405,1444 'qs':1370,1377 'queri':19,75,83,187,231,247,273,294,339,356,392,401,726,1033,1054,1174,1399,1409,1426,1448,1469,1480 'queryset':23,85,196,263,332,371,430,480,571,586,597,874,915,926,1012,1023,1027,1040,1097,1194,1223,1236,1355,1387 'queryset.count':992,1035 'queryset.delete':931 'queryset.exists':999 'queryset.update':887 'rare':224,475,969,1339 'rate':1142 're':979 'read':385 'real':177,982,1280 'recent':409 'relat':254,308,326,446,1110,1112,1181,1203,1231,1243,1435 'related/prefetch_related':458 'relev':1490 'remov':1301 'renam':1511 'render':282,311 'report':54,55,122,226,971,981,1088,1152,1307,1452,1486,1521 'request':219,278,283,305,312,620,817,957 'requir':699,1086,1420,1472,1560 'research':47,107 'restart':495 'return':281,310,354,373,412,1225,1238 'review':4,8,13,39,40,69,104,1158,1254,1553 'round':241,832 'row':244,250,463,507,602,774,1018,1209,1330 'rule':252,316,388,496,530,565,643,686,720,818,856,911,1136 'run':615,952,1133 'safeti':1563 'saniti':1263 'save':864,948 'scale':180 'scan':208,634,663,701 'scope':1534 'script':963,1321 'search':453,1103,1199 'second':1468 'select':457,1109,1202,1230,1242,1434 'self':352,372,411,1224,1237 'self.orders.filter':413 'serial':319,324,365 'serializermethodfield':338 'serializers.integerfield':384 'serializers.modelserializer':344,381 'serializers.serializermethodfield':347 'sever':141,1269 'signific':462 'singl':843,880,929,1031,1398,1428,1437,1476 'site':1130 'size':561,909 'skill':1526 'skill-django-perf-review' 'skip':161,1003 'slice':587,613 'slight':989 'slow':218,816 'small':637,1050,1059 'solut':298,359,425,516,552,583,675,707,842,878,890,928 'sort':698,710 'source-sickn33' 'specif':1548 'specul':101 'state':1457 'state.request.project':1466 'statement':882 'status':735,748,753,757,761,888,902,907 'step':1149 'stop':1554 'stream':553 'style':1286,1495,1516 'submit':1262 'suboptim':990 'substitut':1544 'success':1566 'suggest':1504 'summari':1161 'tabl':207,211,460,485,489,598,633,638,652,695,771,1120,1207,1327 'task':1530 'templat':287,421,513,524,1186 'template/serializer':264,444 'test':1308,1550 'thing':995,1001 'thorough':139 'time':961,1320 'timeout':193,251 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'trace':109,261,438,1092,1128,1191 'treat':1539 'trigger':293,400,1424 'trip':242,833 'true':387,685,719,791,1228,1241 'two':1508 'unbound':84,195,479,570,596,606,943 'unindex':657 'updat':858,861,870,881,893,905 'use':9,63,419,426,531,646,689,721,777,819,857,912,1524 'user':276,279,285,286,289,291,296,303,306,314,315,358,405,512,523,547,551,557,564,580,590,618,668,679,732,734,747,751,955,1193,1206 'user-fac':617,954 'user.objects.all':280,549,582,591 'user.objects.annotate':374 'user.objects.filter':659,1226,1239 'user.objects.iterator':559 'user.objects.select':307 'user.profile.bio':292,1196 'user_list.html':1195 'userlistview':509,520,1176,1192 'users.html':284,313,515,526 'userseri':343,380 'userviewset':367 'usual':1002 'valid':44,120,127,259,433,593,766,932,1085,1147,1162,1190,1257,1549 'valu':884,895 'variabl':1356,1393,1513 'verifi':72,116,459,1115,1131,1210 'view':262,301,322,442,1313 'views.py:45':1179 'viewset':362 'viewsets.modelviewset':368 'volum':118,1117 'vs':986,1013,1346,1378 'want':95 'week':417 'without':702,1188,1349 'won':1332 'worker':494 'worth':225,970 'would':1288 'write':149,213,804,810,935 'x':752,762,1164 'y':754,1165 'yet':1029 'z':1167 'zero':129","prices":[{"id":"49343a05-3f12-4916-9e2f-7d846d1f9d19","listingId":"8440889c-fab6-406e-bf4c-418f229e61e7","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:36:12.192Z"}],"sources":[{"listingId":"8440889c-fab6-406e-bf4c-418f229e61e7","source":"github","sourceId":"sickn33/antigravity-awesome-skills/django-perf-review","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/django-perf-review","isPrimary":false,"firstSeenAt":"2026-04-18T21:36:12.192Z","lastSeenAt":"2026-04-24T06:51:04.948Z"}],"details":{"listingId":"8440889c-fab6-406e-bf4c-418f229e61e7","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"django-perf-review","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34831,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-24T06:41:17Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"73cc8dd1e0d94a764f0f0ca8d6a5da1b9a867456","skill_md_path":"skills/django-perf-review/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/django-perf-review"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"django-perf-review","license":"LICENSE","description":"Django performance code review. Use when asked to \"review Django performance\", \"find N+1 queries\", \"optimize Django\", \"check queryset performance\", \"database performance\", \"Django ORM issues\", or audit Django code for performance problems."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/django-perf-review"},"updatedAt":"2026-04-24T06:51:04.948Z"}}