[{"data":1,"prerenderedAt":954},["ShallowReactive",2],{"blog":3,"blog_index_posts":17},{"id":4,"title":5,"body":6,"description":7,"extension":8,"meta":9,"navigation":10,"path":12,"schemaOrg":6,"seo":13,"sitemap":14,"stem":15,"__hash__":16},"blog\u002Fblog.yml","Blog",null,"Discover the latest insights, tutorials, and updates from our team. Stay informed about web development trends, best practices, and innovative solutions.","yml",{},{"icon":11},"i-lucide-newspaper","\u002Fblog",{"title":5,"description":7},{"loc":12},"blog","22dKzBCCHaohe2GKX3dkoH_Dh4msTeqWw9_kF07MhCU",[18],{"id":19,"title":20,"authors":21,"badge":27,"body":29,"date":935,"description":936,"extension":937,"image":938,"meta":939,"navigation":213,"path":940,"schemaOrg":941,"seo":948,"sitemap":950,"stem":952,"__hash__":953},"posts\u002Fblog\u002F5-years-of-django-pros-and-cons.md","What 5 Years with Django Taught Me: Pros and Cons",[22],{"name":23,"to":24,"avatar":25},"Made Y","\u002F",{"src":26},"\u002Fimages\u002Fprofile2.jpg",{"label":28},"Django",{"type":30,"value":31,"toc":919},"minimark",[32,37,46,50,67,82,85,100,160,164,169,172,439,443,446,804,808,818,822,826,829,833,837,840,858,868,874,878,881,893,897,900,904,907,910,916],[33,34,36],"h2",{"id":35},"introduction","Introduction",[38,39,40,41,45],"p",{},"In this article, I’ll share my real-world experience after ",[42,43,44],"strong",{},"5 years of working with Django",". From small side projects to production web apps. Whether you’re just starting with Django or considering it for your next project, I hope this helps you understand what’s great about it, and where it can get tricky.",[33,47,49],{"id":48},"why-i-chose-django-in-the-first-place","Why I Chose Django in the First Place",[38,51,52,53,56,57,66],{},"I started my web development journey in PHP, learning ",[42,54,55],{},"CodeIgniter"," during an internship at ",[58,59,65],"a",{"className":60,"href":62,"rel":63},[61],"text-primary","https:\u002F\u002Ftorodeveloper.com\u002F",[64],"nofollow","Toro Developer Universal"," in 2018. My main task was to develop a module and UI to automatically generate CRUD operations from existing sql tables. It was a great learning experience, but while working on it, I discovered that Django, a Python framework I’d barely heard of at the time, already had this functionality built in through the Django ORM and Admin. That caught my attention.",[38,68,69,70,73,74,77,78,81],{},"After the internship ended, I decided to explore Django on my own. At first, it was just curiosity. But later, while studying data science and machine learning at university, I was assigned a class project: build a handwriting character recognition model. Using ",[42,71,72],{},"TensorFlow"," and the ",[42,75,76],{},"Keras API"," and ",[42,79,80],{},"Python",", I trained a model that could take an image of handwritten text and predict the letters.",[38,83,84],{},"When my lecturer asked me to showcase the project through a website, Django instantly came to mind. It gave me exactly what I needed; a way to build both the backend API to run predictions and a simple UI for users to upload images, all in one framework.",[38,86,87,88,91,92,95,96,99],{},"By the end of that project, I had a site where people could upload an image, the server would load my trained model, and the prediction results would appear right on the screen. Since then, I’ve used Django to build a variety of applications, from a ",[42,89,90],{},"blogging"," platform where people can sign up and share their stories, to a ",[42,93,94],{},"point-of-sale"," system with dashboard analytics, customized Django Admin, invoicing, and ",[42,97,98],{},"inventory management"," that runs entirely on a store’s local network, connecting everyone from cashiers to storage staff. I’ve also built online stores and catalogs, and through each project, Django has remained my go-to framework for turning ideas into fully functional software.",[101,102,103,115,138],"tabs",{},[104,105,108],"div",{"icon":106,"label":107},"i-lucide-bar-chart-4","Customized Django Admin Dashboard",[38,109,110],{},[111,112],"img",{"alt":113,"src":114},"customized django admin dashboard","\u002Fimages\u002Fchrome_2025-07-24_14-44-25.jpg",[104,116,119],{"icon":117,"label":118},"i-lucide-shopping-cart","Online Store",[120,121,122,130],"pictures",{},[104,123,124],{},[38,125,126],{},[111,127],{"alt":128,"src":129},"superjaya.id catalog","https:\u002F\u002Fres.cloudinary.com\u002Fdhqbr2d4l\u002Fimage\u002Fupload\u002Fv1755144296\u002FSJ1_oztatv.jpg",[104,131,132],{},[38,133,134],{},[111,135],{"alt":136,"src":137},"superjaya.id cart ui","\u002Fimages\u002FSJ2.jpeg",[104,139,142],{"icon":140,"label":141},"i-simple-icons-blogger","Blogging Platform",[120,143,144,152],{},[104,145,146],{},[38,147,148],{},[111,149],{"alt":150,"src":151},"xamarind blogging platform","https:\u002F\u002Fres.cloudinary.com\u002Fdhqbr2d4l\u002Fimage\u002Fupload\u002Fv1755150579\u002Fxamarind1_k8uvjt.webp",[104,153,154],{},[38,155,156],{},[111,157],{"alt":158,"src":159},"xamarind blogging platform article page","https:\u002F\u002Fres.cloudinary.com\u002Fdhqbr2d4l\u002Fimage\u002Fupload\u002Fv1755150579\u002Fxamarind2_w2dnvj.webp",[33,161,163],{"id":162},"the-good-stuff-about-django-pros","The Good Stuff About Django (Pros)",[165,166,168],"h3",{"id":167},"_1-django-orm","1. Django ORM",[38,170,171],{},"One of my favorite thing about Django is the ORM. Not only does it let you work with the database without writing raw SQL, but you can also run Python scripts during migrations. This came in handy more than once. Especially when I needed to populate a newly added column with default values right as the migration ran.",[173,174,179],"pre",{"className":175,"code":176,"language":177,"meta":178,"style":178},"language-python shiki shiki-themes material-theme-lighter github-light github-dark monokai","from django.db import migrations\n\ndef populate_default_status(apps, schema_editor):\n    MyModel = apps.get_model('myapp', 'MyModel')\n    MyModel.objects.filter(status__isnull=True).update(status='pending')\n\nclass Migration(migrations.Migration):\n    dependencies = [\n        ('myapp', '0001_initial'),\n    ]\n    operations = [\n        migrations.RunPython(populate_default_status),\n    ]\n\n","python","",[180,181,182,208,215,242,286,337,342,365,376,400,406,416,434],"code",{"__ignoreMap":178},[183,184,187,191,195,199,202,205],"span",{"class":185,"line":186},"line",1,[183,188,190],{"class":189},"sRxSC","from",[183,192,194],{"class":193},"ss--_"," django",[183,196,198],{"class":197},"swvn1",".",[183,200,201],{"class":193},"db ",[183,203,204],{"class":189},"import",[183,206,207],{"class":193}," migrations\n",[183,209,211],{"class":185,"line":210},2,[183,212,214],{"emptyLinePlaceholder":213},true,"\n",[183,216,218,222,226,229,233,236,239],{"class":185,"line":217},3,[183,219,221],{"class":220},"srJo8","def",[183,223,225],{"class":224},"sD0ED"," populate_default_status",[183,227,228],{"class":197},"(",[183,230,232],{"class":231},"sW6vx","apps",[183,234,235],{"class":197},",",[183,237,238],{"class":231}," schema_editor",[183,240,241],{"class":197},"):\n",[183,243,245,248,252,255,257,261,263,267,271,273,275,278,281,283],{"class":185,"line":244},4,[183,246,247],{"class":193},"    MyModel ",[183,249,251],{"class":250},"sGXK2","=",[183,253,254],{"class":193}," apps",[183,256,198],{"class":197},[183,258,260],{"class":259},"sAZ-3","get_model",[183,262,228],{"class":197},[183,264,266],{"class":265},"siCPE","'",[183,268,270],{"class":269},"sLACW","myapp",[183,272,266],{"class":265},[183,274,235],{"class":197},[183,276,277],{"class":265}," '",[183,279,280],{"class":269},"MyModel",[183,282,266],{"class":265},[183,284,285],{"class":197},")\n",[183,287,289,292,294,298,300,303,305,309,311,315,318,321,323,326,328,330,333,335],{"class":185,"line":288},5,[183,290,291],{"class":193},"    MyModel",[183,293,198],{"class":197},[183,295,297],{"class":296},"squCx","objects",[183,299,198],{"class":197},[183,301,302],{"class":259},"filter",[183,304,228],{"class":197},[183,306,308],{"class":307},"sQgqH","status__isnull",[183,310,251],{"class":250},[183,312,314],{"class":313},"sMTiH","True",[183,316,317],{"class":197},").",[183,319,320],{"class":259},"update",[183,322,228],{"class":197},[183,324,325],{"class":307},"status",[183,327,251],{"class":250},[183,329,266],{"class":265},[183,331,332],{"class":269},"pending",[183,334,266],{"class":265},[183,336,285],{"class":197},[183,338,340],{"class":185,"line":339},6,[183,341,214],{"emptyLinePlaceholder":213},[183,343,345,348,352,354,358,360,363],{"class":185,"line":344},7,[183,346,347],{"class":220},"class",[183,349,351],{"class":350},"sKvfc"," Migration",[183,353,228],{"class":197},[183,355,357],{"class":356},"sW3Pz","migrations",[183,359,198],{"class":197},[183,361,362],{"class":356},"Migration",[183,364,241],{"class":197},[183,366,368,371,373],{"class":185,"line":367},8,[183,369,370],{"class":193},"    dependencies ",[183,372,251],{"class":250},[183,374,375],{"class":197}," [\n",[183,377,379,382,384,386,388,390,392,395,397],{"class":185,"line":378},9,[183,380,381],{"class":197},"        (",[183,383,266],{"class":265},[183,385,270],{"class":269},[183,387,266],{"class":265},[183,389,235],{"class":197},[183,391,277],{"class":265},[183,393,394],{"class":269},"0001_initial",[183,396,266],{"class":265},[183,398,399],{"class":197},"),\n",[183,401,403],{"class":185,"line":402},10,[183,404,405],{"class":197},"    ]\n",[183,407,409,412,414],{"class":185,"line":408},11,[183,410,411],{"class":193},"    operations ",[183,413,251],{"class":250},[183,415,375],{"class":197},[183,417,419,422,424,427,429,432],{"class":185,"line":418},12,[183,420,421],{"class":193},"        migrations",[183,423,198],{"class":197},[183,425,426],{"class":259},"RunPython",[183,428,228],{"class":197},[183,430,431],{"class":259},"populate_default_status",[183,433,399],{"class":197},[183,435,437],{"class":185,"line":436},13,[183,438,405],{"class":197},[165,440,442],{"id":441},"_2-django-management-commands","2. Django Management Commands",[38,444,445],{},"Management commands feel like little superpowers baked into the framework. They let me run Python scripts directly inside the Django environment, which is perfect for tasks like populating fields, importing \u002F exporting data, fixing incorrect values, or even creating quick backups. Whenever I need to tweak or move data, management commands are my go-to tool. For example, Here’s a management command that generates slugs for any blog post that doesn’t have one:",[173,447,449],{"className":175,"code":448,"language":177,"meta":178,"style":178},"# blog\u002Fmanagement\u002Fcommands\u002Ffix_missing_slug.py\n\n# python manage.py fix_missing_slug\n\nfrom django.core.management.base import BaseCommand\nfrom django.utils.text import slugify\nfrom blog.models import Article\n\n\nclass Command(BaseCommand):\n    help = \"Generate slugs for articles that don't have one yet\"\n\n    def handle(self, *args, **options):\n        articles_without_slug = Article.objects.filter(slug__isnull=True)\n\n        for article in articles_without_slug:\n            article.slug = slugify(article.title)\n            article.save()\n            self.stdout.write(self.style.SUCCESS(f\"Slug set for: {article.title}\"))\n\n        self.stdout.write(self.style.SUCCESS(\"Done!\"))\n\n",[180,450,451,457,461,466,470,496,517,534,538,542,556,574,578,610,640,645,663,691,704,762,767],{"__ignoreMap":178},[183,452,453],{"class":185,"line":186},[183,454,456],{"class":455},"ss7Ak","# blog\u002Fmanagement\u002Fcommands\u002Ffix_missing_slug.py\n",[183,458,459],{"class":185,"line":210},[183,460,214],{"emptyLinePlaceholder":213},[183,462,463],{"class":185,"line":217},[183,464,465],{"class":455},"# python manage.py fix_missing_slug\n",[183,467,468],{"class":185,"line":244},[183,469,214],{"emptyLinePlaceholder":213},[183,471,472,474,476,478,481,483,486,488,491,493],{"class":185,"line":288},[183,473,190],{"class":189},[183,475,194],{"class":193},[183,477,198],{"class":197},[183,479,480],{"class":193},"core",[183,482,198],{"class":197},[183,484,485],{"class":193},"management",[183,487,198],{"class":197},[183,489,490],{"class":193},"base ",[183,492,204],{"class":189},[183,494,495],{"class":193}," BaseCommand\n",[183,497,498,500,502,504,507,509,512,514],{"class":185,"line":339},[183,499,190],{"class":189},[183,501,194],{"class":193},[183,503,198],{"class":197},[183,505,506],{"class":193},"utils",[183,508,198],{"class":197},[183,510,511],{"class":193},"text ",[183,513,204],{"class":189},[183,515,516],{"class":193}," slugify\n",[183,518,519,521,524,526,529,531],{"class":185,"line":344},[183,520,190],{"class":189},[183,522,523],{"class":193}," blog",[183,525,198],{"class":197},[183,527,528],{"class":193},"models ",[183,530,204],{"class":189},[183,532,533],{"class":193}," Article\n",[183,535,536],{"class":185,"line":367},[183,537,214],{"emptyLinePlaceholder":213},[183,539,540],{"class":185,"line":378},[183,541,214],{"emptyLinePlaceholder":213},[183,543,544,546,549,551,554],{"class":185,"line":402},[183,545,347],{"class":220},[183,547,548],{"class":350}," Command",[183,550,228],{"class":197},[183,552,553],{"class":356},"BaseCommand",[183,555,241],{"class":197},[183,557,558,562,565,568,571],{"class":185,"line":408},[183,559,561],{"class":560},"sMLJd","    help",[183,563,564],{"class":250}," =",[183,566,567],{"class":265}," \"",[183,569,570],{"class":269},"Generate slugs for articles that don't have one yet",[183,572,573],{"class":265},"\"\n",[183,575,576],{"class":185,"line":418},[183,577,214],{"emptyLinePlaceholder":213},[183,579,580,583,586,588,592,594,597,600,602,605,608],{"class":185,"line":436},[183,581,582],{"class":220},"    def",[183,584,585],{"class":224}," handle",[183,587,228],{"class":197},[183,589,591],{"class":590},"sDdYn","self",[183,593,235],{"class":197},[183,595,596],{"class":250}," *",[183,598,599],{"class":231},"args",[183,601,235],{"class":197},[183,603,604],{"class":250}," **",[183,606,607],{"class":231},"options",[183,609,241],{"class":197},[183,611,613,616,618,621,623,625,627,629,631,634,636,638],{"class":185,"line":612},14,[183,614,615],{"class":193},"        articles_without_slug ",[183,617,251],{"class":250},[183,619,620],{"class":193}," Article",[183,622,198],{"class":197},[183,624,297],{"class":296},[183,626,198],{"class":197},[183,628,302],{"class":259},[183,630,228],{"class":197},[183,632,633],{"class":307},"slug__isnull",[183,635,251],{"class":250},[183,637,314],{"class":313},[183,639,285],{"class":197},[183,641,643],{"class":185,"line":642},15,[183,644,214],{"emptyLinePlaceholder":213},[183,646,648,651,654,657,660],{"class":185,"line":647},16,[183,649,650],{"class":189},"        for",[183,652,653],{"class":193}," article ",[183,655,656],{"class":189},"in",[183,658,659],{"class":193}," articles_without_slug",[183,661,662],{"class":197},":\n",[183,664,666,669,671,674,676,679,681,684,686,689],{"class":185,"line":665},17,[183,667,668],{"class":193},"            article",[183,670,198],{"class":197},[183,672,673],{"class":296},"slug",[183,675,564],{"class":250},[183,677,678],{"class":259}," slugify",[183,680,228],{"class":197},[183,682,683],{"class":259},"article",[183,685,198],{"class":197},[183,687,688],{"class":296},"title",[183,690,285],{"class":197},[183,692,694,696,698,701],{"class":185,"line":693},18,[183,695,668],{"class":193},[183,697,198],{"class":197},[183,699,700],{"class":259},"save",[183,702,703],{"class":197},"()\n",[183,705,707,711,713,716,718,721,723,725,727,730,732,735,737,740,743,747,749,751,753,756,759],{"class":185,"line":706},19,[183,708,710],{"class":709},"sSsL9","            self",[183,712,198],{"class":197},[183,714,715],{"class":296},"stdout",[183,717,198],{"class":197},[183,719,720],{"class":259},"write",[183,722,228],{"class":197},[183,724,591],{"class":709},[183,726,198],{"class":197},[183,728,729],{"class":296},"style",[183,731,198],{"class":197},[183,733,734],{"class":259},"SUCCESS",[183,736,228],{"class":197},[183,738,739],{"class":220},"f",[183,741,742],{"class":269},"\"Slug set for: ",[183,744,746],{"class":745},"sYThS","{",[183,748,683],{"class":259},[183,750,198],{"class":197},[183,752,688],{"class":296},[183,754,755],{"class":745},"}",[183,757,758],{"class":269},"\"",[183,760,761],{"class":197},"))\n",[183,763,765],{"class":185,"line":764},20,[183,766,214],{"emptyLinePlaceholder":213},[183,768,770,773,775,777,779,781,783,785,787,789,791,793,795,797,800,802],{"class":185,"line":769},21,[183,771,772],{"class":709},"        self",[183,774,198],{"class":197},[183,776,715],{"class":296},[183,778,198],{"class":197},[183,780,720],{"class":259},[183,782,228],{"class":197},[183,784,591],{"class":709},[183,786,198],{"class":197},[183,788,729],{"class":296},[183,790,198],{"class":197},[183,792,734],{"class":259},[183,794,228],{"class":197},[183,796,758],{"class":265},[183,798,799],{"class":269},"Done!",[183,801,758],{"class":265},[183,803,761],{"class":197},[165,805,807],{"id":806},"_3-the-django-admin","3. The Django Admin",[38,809,810,811,817],{},"This is what first caught my attention back in my CodeIgniter days. Django can turn your models into a fully functional CRUD interface instantly. It’s incredibly useful for development and testing, but it’s not just for that; I’ve built entire internal tools with customized Django Admin. With the right tweaks (and a little help from packages like ",[58,812,816],{"className":813,"href":814,"rel":815},[61],"https:\u002F\u002Funfoldadmin.com\u002F",[64],"Django Unfold"," for a modern UI), you can make it both powerful and beautiful. It makes building apps with an administration fast and efficient.",[38,819,820],{},[111,821],{"alt":113,"src":114},[165,823,825],{"id":824},"_4-time-to-market","4. Time to Market",[38,827,828],{},"When people talk about rapid development, Django is one of the few frameworks that actually delivers. Between the admin, ORM, and built-in features, I can go from idea to a working prototype in a fraction of the time it would take with many other stacks. It truly comes “batteries included”: authentication, forms, and user management are already there out of the box. And when I’ve needed something more specialized, like APIs, or payments, the community has always had excellent, battle-tested libraries ready to go. Whatever the challenge, there’s almost always a solution at hand.",[33,830,832],{"id":831},"the-not-so-great-parts-cons-of-django","The Not-So-Great Parts (Cons of Django)",[165,834,836],{"id":835},"_1-the-spoiled-kid-effect","1. The “Spoiled Kid” Effect",[38,838,839],{},"Spending years with a highly opinionated framework like Django make me a little spoiled. I realized this when I had to learn another (more barebone) web framework for work, aspnetcore. Django (and Python in general) spoils you with free, open-source, maintained community libraries for almost anything you can imagine. In contrast, in the other hand, you might not even find a library that does exactly what you need; and if you do, there’s a chance it’s freemium or commercial, which makes you appreciate Django’s open-source ecosystem even more. It’s not Django’s fault, but it does make switching stacks a bit of a shock.",[841,842,843,846],"picture-and-caption",{},[38,844,845],{},"\"Where batteries?\"",[847,848,849],"template",{"v-slot:image":178},[38,850,851],{},[111,852],{"alt":853,"src":854,"className":855},"caveman","https:\u002F\u002Fi.kym-cdn.com\u002Fentries\u002Ficons\u002Foriginal\u002F000\u002F038\u002F301\u002Fcavemancover.jpg",[856,857],"rounded-lg","my-0",[38,859,860,861,864,865],{},"Another frustration comes when I need to run quick, one-off tasks. In Django, I can whip up a management command, drop it into my app, and run it inside the full project environment with a simple ",[180,862,863],{},"python manage.py mycommand",". It’s effortless. Everything loads with the same settings, database, and context I already use. In a more barebone web framework like aspnetcore, there’s no such luxury. I often end up creating clunky python scripts, console apps, or temporarily jamming code into controllers just to execute a simple job. ",[42,866,867],{},"Once you’ve lived with Django’s workflow, you really feel the pain of not having it elsewhere.",[38,869,870,871],{},"And then there’s the setup. Django’s “batteries-included” approach spoils you so much that working without it feels exhausting. Authentication, ORM, admin, migrations, they’re all just there in Django. But in a more barebone web framework, I suddenly find myself wiring up middleware, configuring dependency injection, and hunting for packages just to get to the same baseline Django gives me on day one. ",[42,872,873],{},"Once you’ve been spoiled by Django’s defaults, going back to the “manual labor” world of other frameworks is a real test of patience.",[165,875,877],{"id":876},"_2-performance-or-the-reputation-of-it","2. Performance (or the Reputation of It)",[38,879,880],{},"If you hang around tech forums long enough, you’ll hear people say Python, and by extension Django is “slow”. In absolute terms, yes, it’s not going to beat a Go or Java or dotnet backend in raw speed. But in practice, I’ve found Django to be more than fast enough for my projects. That said, for extremely high-performance, low-latency systems, Django might not be the first tool you reach for without careful optimization or caching strategies.",[104,882,887],{"className":883},[884,885,886],"w-full","flex","justify-center",[38,888,889],{},[111,890],{"alt":891,"src":892},"django benchmark fortune","https:\u002F\u002Fres.cloudinary.com\u002Fdhqbr2d4l\u002Fimage\u002Fupload\u002Fv1755144309\u002Fdjango_benchmark_j1gqsh.jpg",[165,894,896],{"id":895},"_3-javascript-frameworks-integration","3. JavaScript Frameworks Integration",[38,898,899],{},"Django works great on the backend, but integrating it smoothly with modern JavaScript frameworks isn’t as polished as in some other ecosystems. For example, Laravel has Inertia.js, which makes connecting Vue or React feel almost seamless. With Django, you either stick to traditional server-rendered templates or set up a separate frontend project.",[33,901,903],{"id":902},"final-thoughts","Final Thoughts",[38,905,906],{},"Django has been a big part of my journey as a developer. It’s not perfect, but it’s powerful. The key is knowing when it’s the right tool for the job, and how to make the most of it.",[908,909],"hr",{},[38,911,912],{},[913,914,915],"em",{},"Have you been working with Django too? I’d love to hear them!",[729,917,918],{},"html pre.shiki code .sRxSC, html code.shiki .sRxSC{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#F92672;--shiki-sepia-font-style:inherit}html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .srJo8, html code.shiki .srJo8{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sW6vx, html code.shiki .sW6vx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#24292E;--shiki-default-font-style:inherit;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sAZ-3, html code.shiki .sAZ-3{--shiki-light:#6182B8;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .squCx, html code.shiki .squCx{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sQgqH, html code.shiki .sQgqH{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .sMTiH, html code.shiki .sMTiH{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sKvfc, html code.shiki .sKvfc{--shiki-light:#E2931D;--shiki-light-text-decoration:inherit;--shiki-default:#6F42C1;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .sW3Pz, html code.shiki .sW3Pz{--shiki-light:#E2931D;--shiki-light-font-style:inherit;--shiki-light-text-decoration:inherit;--shiki-default:#6F42C1;--shiki-default-font-style:inherit;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-font-style:italic;--shiki-sepia-text-decoration:underline}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}html pre.shiki code .sMLJd, html code.shiki .sMLJd{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .sDdYn, html code.shiki .sDdYn{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#24292E;--shiki-default-font-style:inherit;--shiki-dark:#E1E4E8;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .sSsL9, html code.shiki .sSsL9{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#FD971F}html pre.shiki code .sYThS, html code.shiki .sYThS{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}",{"title":178,"searchDepth":210,"depth":217,"links":920},[921,922,923,929,934],{"id":35,"depth":210,"text":36},{"id":48,"depth":210,"text":49},{"id":162,"depth":210,"text":163,"children":924},[925,926,927,928],{"id":167,"depth":217,"text":168},{"id":441,"depth":217,"text":442},{"id":806,"depth":217,"text":807},{"id":824,"depth":217,"text":825},{"id":831,"depth":210,"text":832,"children":930},[931,932,933],{"id":835,"depth":217,"text":836},{"id":876,"depth":217,"text":877},{"id":895,"depth":217,"text":896},{"id":902,"depth":210,"text":903},"2025-08-13","After half a decade of building apps with Django, here’s my honest take on its strengths, weaknesses, and the lessons I’ve learned along the way.","md",{"src":114},{},"\u002Fblog\u002F5-years-of-django-pros-and-cons",[942],{"headline":943,"author":944,"datePublished":935,"@type":947},"5 Years with Django: The Good, The Bad, and What I Wish I Knew Earlier",{"name":945,"@type":946},"Made Yoga","Person","BlogPosting",{"keywords":949,"title":20,"description":936},"django, django review, django pros and cons, python web framework, django developer experience",{"loc":940,"lastmod":951},"2025-08-20","blog\u002F5-years-of-django-pros-and-cons","F6tfwp-SBE9OX9-LAt1zBMkkFYODD--FIYH1C9NslD8",1783781938671]