[{"data":1,"prerenderedAt":14244},["ShallowReactive",2],{"navigation":3,"/microservices-with-django/restful-apis":1016,"/microservices-with-django/restful-apis-surround":14239},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":897,"body":1018,"description":1028,"extension":14234,"links":14235,"meta":14236,"navigation":1219,"path":898,"seo":14237,"stem":899,"__hash__":14238},"docs/27.microservices-with-django/06.restful-apis.md",{"type":1019,"value":1020,"toc":14214},"minimark",[1021,1025,1029,1034,1039,1042,1384,1388,2356,2360,2856,2860,2864,4223,4227,5113,5117,7030,7034,8290,8294,8298,10685,10689,11897,11901,12887,12891,14153,14157,14160,14207,14210],[1022,1023,897],"h1",{"id":1024},"creating-restful-apis-for-microservices",[1026,1027,1028],"p",{},"RESTful APIs are the backbone of microservices communication. This section covers designing, implementing, and optimizing REST APIs using Django REST Framework for microservices architecture.",[1030,1031,1033],"h2",{"id":1032},"rest-api-design-principles","REST API Design Principles",[1035,1036,1038],"h3",{"id":1037},"_1-resource-based-urls","1. Resource-Based URLs",[1026,1040,1041],{},"Design URLs around resources, not actions:",[1043,1044,1049],"pre",{"className":1045,"code":1046,"language":1047,"meta":1048,"style":1048},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Good - Resource-based URLs\nGET    /api/v1/users/              # Get all users\nGET    /api/v1/users/{id}/         # Get specific user\nPOST   /api/v1/users/              # Create user\nPUT    /api/v1/users/{id}/         # Update user\nDELETE /api/v1/users/{id}/         # Delete user\n\n# Nested resources\nGET    /api/v1/users/{id}/orders/  # Get user's orders\nPOST   /api/v1/users/{id}/orders/  # Create order for user\n\n# Bad - Action-based URLs\nPOST   /api/v1/createUser/\nGET    /api/v1/getUserById/{id}/\nPOST   /api/v1/deleteUser/{id}/\n","python","",[1050,1051,1052,1061,1092,1127,1151,1182,1214,1221,1227,1262,1296,1301,1307,1328,1356],"code",{"__ignoreMap":1048},[1053,1054,1057],"span",{"class":1055,"line":1056},"line",1,[1053,1058,1060],{"class":1059},"s9Tkl","# Good - Resource-based URLs\n",[1053,1062,1064,1068,1072,1076,1079,1082,1084,1087,1089],{"class":1055,"line":1063},2,[1053,1065,1067],{"class":1066},"se3Ec","GET",[1053,1069,1071],{"class":1070},"sVsLi","    /",[1053,1073,1075],{"class":1074},"sftqT","api",[1053,1077,1078],{"class":1070},"/",[1053,1080,1081],{"class":1074},"v1",[1053,1083,1078],{"class":1070},[1053,1085,1086],{"class":1074},"users",[1053,1088,1078],{"class":1070},[1053,1090,1091],{"class":1059},"              # Get all users\n",[1053,1093,1095,1097,1099,1101,1103,1105,1107,1109,1111,1115,1119,1122,1124],{"class":1055,"line":1094},3,[1053,1096,1067],{"class":1066},[1053,1098,1071],{"class":1070},[1053,1100,1075],{"class":1074},[1053,1102,1078],{"class":1070},[1053,1104,1081],{"class":1074},[1053,1106,1078],{"class":1070},[1053,1108,1086],{"class":1074},[1053,1110,1078],{"class":1070},[1053,1112,1114],{"class":1113},"soVBu","{",[1053,1116,1118],{"class":1117},"sJdAF","id",[1053,1120,1121],{"class":1113},"}",[1053,1123,1078],{"class":1070},[1053,1125,1126],{"class":1059},"         # Get specific user\n",[1053,1128,1130,1133,1136,1138,1140,1142,1144,1146,1148],{"class":1055,"line":1129},4,[1053,1131,1132],{"class":1066},"POST",[1053,1134,1135],{"class":1070},"   /",[1053,1137,1075],{"class":1074},[1053,1139,1078],{"class":1070},[1053,1141,1081],{"class":1074},[1053,1143,1078],{"class":1070},[1053,1145,1086],{"class":1074},[1053,1147,1078],{"class":1070},[1053,1149,1150],{"class":1059},"              # Create user\n",[1053,1152,1154,1157,1159,1161,1163,1165,1167,1169,1171,1173,1175,1177,1179],{"class":1055,"line":1153},5,[1053,1155,1156],{"class":1066},"PUT",[1053,1158,1071],{"class":1070},[1053,1160,1075],{"class":1074},[1053,1162,1078],{"class":1070},[1053,1164,1081],{"class":1074},[1053,1166,1078],{"class":1070},[1053,1168,1086],{"class":1074},[1053,1170,1078],{"class":1070},[1053,1172,1114],{"class":1113},[1053,1174,1118],{"class":1117},[1053,1176,1121],{"class":1113},[1053,1178,1078],{"class":1070},[1053,1180,1181],{"class":1059},"         # Update user\n",[1053,1183,1185,1188,1191,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211],{"class":1055,"line":1184},6,[1053,1186,1187],{"class":1066},"DELETE",[1053,1189,1190],{"class":1070}," /",[1053,1192,1075],{"class":1074},[1053,1194,1078],{"class":1070},[1053,1196,1081],{"class":1074},[1053,1198,1078],{"class":1070},[1053,1200,1086],{"class":1074},[1053,1202,1078],{"class":1070},[1053,1204,1114],{"class":1113},[1053,1206,1118],{"class":1117},[1053,1208,1121],{"class":1113},[1053,1210,1078],{"class":1070},[1053,1212,1213],{"class":1059},"         # Delete user\n",[1053,1215,1217],{"class":1055,"line":1216},7,[1053,1218,1220],{"emptyLinePlaceholder":1219},true,"\n",[1053,1222,1224],{"class":1055,"line":1223},8,[1053,1225,1226],{"class":1059},"# Nested resources\n",[1053,1228,1230,1232,1234,1236,1238,1240,1242,1244,1246,1248,1250,1252,1254,1257,1259],{"class":1055,"line":1229},9,[1053,1231,1067],{"class":1066},[1053,1233,1071],{"class":1070},[1053,1235,1075],{"class":1074},[1053,1237,1078],{"class":1070},[1053,1239,1081],{"class":1074},[1053,1241,1078],{"class":1070},[1053,1243,1086],{"class":1074},[1053,1245,1078],{"class":1070},[1053,1247,1114],{"class":1113},[1053,1249,1118],{"class":1117},[1053,1251,1121],{"class":1113},[1053,1253,1078],{"class":1070},[1053,1255,1256],{"class":1074},"orders",[1053,1258,1078],{"class":1070},[1053,1260,1261],{"class":1059},"  # Get user's orders\n",[1053,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293],{"class":1055,"line":1264},10,[1053,1266,1132],{"class":1066},[1053,1268,1135],{"class":1070},[1053,1270,1075],{"class":1074},[1053,1272,1078],{"class":1070},[1053,1274,1081],{"class":1074},[1053,1276,1078],{"class":1070},[1053,1278,1086],{"class":1074},[1053,1280,1078],{"class":1070},[1053,1282,1114],{"class":1113},[1053,1284,1118],{"class":1117},[1053,1286,1121],{"class":1113},[1053,1288,1078],{"class":1070},[1053,1290,1256],{"class":1074},[1053,1292,1078],{"class":1070},[1053,1294,1295],{"class":1059},"  # Create order for user\n",[1053,1297,1299],{"class":1055,"line":1298},11,[1053,1300,1220],{"emptyLinePlaceholder":1219},[1053,1302,1304],{"class":1055,"line":1303},12,[1053,1305,1306],{"class":1059},"# Bad - Action-based URLs\n",[1053,1308,1310,1312,1314,1316,1318,1320,1322,1325],{"class":1055,"line":1309},13,[1053,1311,1132],{"class":1066},[1053,1313,1135],{"class":1070},[1053,1315,1075],{"class":1074},[1053,1317,1078],{"class":1070},[1053,1319,1081],{"class":1074},[1053,1321,1078],{"class":1070},[1053,1323,1324],{"class":1074},"createUser",[1053,1326,1327],{"class":1070},"/\n",[1053,1329,1331,1333,1335,1337,1339,1341,1343,1346,1348,1350,1352,1354],{"class":1055,"line":1330},14,[1053,1332,1067],{"class":1066},[1053,1334,1071],{"class":1070},[1053,1336,1075],{"class":1074},[1053,1338,1078],{"class":1070},[1053,1340,1081],{"class":1074},[1053,1342,1078],{"class":1070},[1053,1344,1345],{"class":1074},"getUserById",[1053,1347,1078],{"class":1070},[1053,1349,1114],{"class":1113},[1053,1351,1118],{"class":1117},[1053,1353,1121],{"class":1113},[1053,1355,1327],{"class":1070},[1053,1357,1359,1361,1363,1365,1367,1369,1371,1374,1376,1378,1380,1382],{"class":1055,"line":1358},15,[1053,1360,1132],{"class":1066},[1053,1362,1135],{"class":1070},[1053,1364,1075],{"class":1074},[1053,1366,1078],{"class":1070},[1053,1368,1081],{"class":1074},[1053,1370,1078],{"class":1070},[1053,1372,1373],{"class":1074},"deleteUser",[1053,1375,1078],{"class":1070},[1053,1377,1114],{"class":1113},[1053,1379,1118],{"class":1117},[1053,1381,1121],{"class":1113},[1053,1383,1327],{"class":1070},[1035,1385,1387],{"id":1386},"_2-http-methods-and-status-codes","2. HTTP Methods and Status Codes",[1043,1389,1391],{"className":1045,"code":1390,"language":1047,"meta":1048,"style":1048},"# views.py\nfrom rest_framework import status\nfrom rest_framework.response import Response\nfrom rest_framework.viewsets import ModelViewSet\n\nclass UserViewSet(ModelViewSet):\n    \"\"\"RESTful user management with proper HTTP methods\"\"\"\n    \n    def create(self, request):\n        \"\"\"POST /api/v1/users/ - Create new user\"\"\"\n        serializer = self.get_serializer(data=request.data)\n        if serializer.is_valid():\n            user = serializer.save()\n            return Response(\n                serializer.data, \n                status=status.HTTP_201_CREATED,\n                headers={'Location': f'/api/v1/users/{user.id}/'}\n            )\n        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)\n    \n    def retrieve(self, request, pk=None):\n        \"\"\"GET /api/v1/users/{id}/ - Get specific user\"\"\"\n        try:\n            user = self.get_object()\n            serializer = self.get_serializer(user)\n            return Response(serializer.data, status=status.HTTP_200_OK)\n        except User.DoesNotExist:\n            return Response(\n                {'error': 'User not found'}, \n                status=status.HTTP_404_NOT_FOUND\n            )\n    \n    def update(self, request, pk=None):\n        \"\"\"PUT /api/v1/users/{id}/ - Full update\"\"\"\n        user = self.get_object()\n        serializer = self.get_serializer(user, data=request.data)\n        if serializer.is_valid():\n            serializer.save()\n            return Response(serializer.data, status=status.HTTP_200_OK)\n        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)\n    \n    def partial_update(self, request, pk=None):\n        \"\"\"PATCH /api/v1/users/{id}/ - Partial update\"\"\"\n        user = self.get_object()\n        serializer = self.get_serializer(user, data=request.data, partial=True)\n        if serializer.is_valid():\n            serializer.save()\n            return Response(serializer.data, status=status.HTTP_200_OK)\n        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)\n    \n    def destroy(self, request, pk=None):\n        \"\"\"DELETE /api/v1/users/{id}/ - Delete user\"\"\"\n        user = self.get_object()\n        user.delete()\n        return Response(status=status.HTTP_204_NO_CONTENT)\n",[1050,1392,1393,1398,1413,1431,1447,1451,1471,1484,1489,1513,1523,1559,1575,1592,1603,1617,1637,1683,1689,1723,1728,1757,1767,1776,1792,1812,1842,1858,1867,1895,1909,1914,1919,1945,1955,1971,2003,2016,2028,2057,2086,2091,2117,2127,2142,2183,2196,2207,2236,2265,2270,2296,2306,2321,2334],{"__ignoreMap":1048},[1053,1394,1395],{"class":1055,"line":1056},[1053,1396,1397],{"class":1059},"# views.py\n",[1053,1399,1400,1404,1407,1410],{"class":1055,"line":1063},[1053,1401,1403],{"class":1402},"siDh9","from",[1053,1405,1406],{"class":1074}," rest_framework ",[1053,1408,1409],{"class":1402},"import",[1053,1411,1412],{"class":1074}," status\n",[1053,1414,1415,1417,1420,1423,1426,1428],{"class":1055,"line":1094},[1053,1416,1403],{"class":1402},[1053,1418,1419],{"class":1074}," rest_framework",[1053,1421,1422],{"class":1113},".",[1053,1424,1425],{"class":1074},"response ",[1053,1427,1409],{"class":1402},[1053,1429,1430],{"class":1074}," Response\n",[1053,1432,1433,1435,1437,1439,1442,1444],{"class":1055,"line":1129},[1053,1434,1403],{"class":1402},[1053,1436,1419],{"class":1074},[1053,1438,1422],{"class":1113},[1053,1440,1441],{"class":1074},"viewsets ",[1053,1443,1409],{"class":1402},[1053,1445,1446],{"class":1074}," ModelViewSet\n",[1053,1448,1449],{"class":1055,"line":1153},[1053,1450,1220],{"emptyLinePlaceholder":1219},[1053,1452,1453,1457,1461,1464,1468],{"class":1055,"line":1184},[1053,1454,1456],{"class":1455},"s5Kfy","class",[1053,1458,1460],{"class":1459},"sD-vU"," UserViewSet",[1053,1462,1463],{"class":1113},"(",[1053,1465,1467],{"class":1466},"sYn-s","ModelViewSet",[1053,1469,1470],{"class":1113},"):\n",[1053,1472,1473,1477,1481],{"class":1055,"line":1216},[1053,1474,1476],{"class":1475},"sm7ve","    \"\"\"",[1053,1478,1480],{"class":1479},"sVyVU","RESTful user management with proper HTTP methods",[1053,1482,1483],{"class":1475},"\"\"\"\n",[1053,1485,1486],{"class":1055,"line":1223},[1053,1487,1488],{"class":1074},"    \n",[1053,1490,1491,1494,1498,1500,1504,1507,1511],{"class":1055,"line":1229},[1053,1492,1493],{"class":1455},"    def",[1053,1495,1497],{"class":1496},"sljsM"," create",[1053,1499,1463],{"class":1113},[1053,1501,1503],{"class":1502},"sRjD_","self",[1053,1505,1506],{"class":1113},",",[1053,1508,1510],{"class":1509},"sCyAa"," request",[1053,1512,1470],{"class":1113},[1053,1514,1515,1518,1521],{"class":1055,"line":1264},[1053,1516,1517],{"class":1475},"        \"\"\"",[1053,1519,1520],{"class":1479},"POST /api/v1/users/ - Create new user",[1053,1522,1483],{"class":1475},[1053,1524,1525,1528,1531,1534,1536,1540,1542,1546,1548,1551,1553,1556],{"class":1055,"line":1298},[1053,1526,1527],{"class":1074},"        serializer ",[1053,1529,1530],{"class":1113},"=",[1053,1532,1533],{"class":1066}," self",[1053,1535,1422],{"class":1113},[1053,1537,1539],{"class":1538},"siWMO","get_serializer",[1053,1541,1463],{"class":1113},[1053,1543,1545],{"class":1544},"sqOPj","data",[1053,1547,1530],{"class":1113},[1053,1549,1550],{"class":1538},"request",[1053,1552,1422],{"class":1113},[1053,1554,1545],{"class":1555},"sBPpx",[1053,1557,1558],{"class":1113},")\n",[1053,1560,1561,1564,1567,1569,1572],{"class":1055,"line":1303},[1053,1562,1563],{"class":1402},"        if",[1053,1565,1566],{"class":1074}," serializer",[1053,1568,1422],{"class":1113},[1053,1570,1571],{"class":1538},"is_valid",[1053,1573,1574],{"class":1113},"():\n",[1053,1576,1577,1580,1582,1584,1586,1589],{"class":1055,"line":1309},[1053,1578,1579],{"class":1074},"            user ",[1053,1581,1530],{"class":1113},[1053,1583,1566],{"class":1074},[1053,1585,1422],{"class":1113},[1053,1587,1588],{"class":1538},"save",[1053,1590,1591],{"class":1113},"()\n",[1053,1593,1594,1597,1600],{"class":1055,"line":1330},[1053,1595,1596],{"class":1402},"            return",[1053,1598,1599],{"class":1538}," Response",[1053,1601,1602],{"class":1113},"(\n",[1053,1604,1605,1608,1610,1612,1614],{"class":1055,"line":1358},[1053,1606,1607],{"class":1538},"                serializer",[1053,1609,1422],{"class":1113},[1053,1611,1545],{"class":1555},[1053,1613,1506],{"class":1113},[1053,1615,1616],{"class":1538}," \n",[1053,1618,1620,1623,1625,1628,1630,1634],{"class":1055,"line":1619},16,[1053,1621,1622],{"class":1544},"                status",[1053,1624,1530],{"class":1113},[1053,1626,1627],{"class":1538},"status",[1053,1629,1422],{"class":1113},[1053,1631,1633],{"class":1632},"sFGJz","HTTP_201_CREATED",[1053,1635,1636],{"class":1113},",\n",[1053,1638,1640,1643,1646,1650,1654,1656,1659,1662,1665,1668,1671,1673,1675,1677,1680],{"class":1055,"line":1639},17,[1053,1641,1642],{"class":1544},"                headers",[1053,1644,1645],{"class":1113},"={",[1053,1647,1649],{"class":1648},"sbYkP","'",[1053,1651,1653],{"class":1652},"sTbE_","Location",[1053,1655,1649],{"class":1648},[1053,1657,1658],{"class":1113},":",[1053,1660,1661],{"class":1455}," f",[1053,1663,1664],{"class":1652},"'/api/v1/users/",[1053,1666,1114],{"class":1667},"s3h35",[1053,1669,1670],{"class":1538},"user",[1053,1672,1422],{"class":1113},[1053,1674,1118],{"class":1555},[1053,1676,1121],{"class":1667},[1053,1678,1679],{"class":1652},"/'",[1053,1681,1682],{"class":1113},"}\n",[1053,1684,1686],{"class":1055,"line":1685},18,[1053,1687,1688],{"class":1113},"            )\n",[1053,1690,1692,1695,1697,1699,1702,1704,1707,1709,1712,1714,1716,1718,1721],{"class":1055,"line":1691},19,[1053,1693,1694],{"class":1402},"        return",[1053,1696,1599],{"class":1538},[1053,1698,1463],{"class":1113},[1053,1700,1701],{"class":1538},"serializer",[1053,1703,1422],{"class":1113},[1053,1705,1706],{"class":1555},"errors",[1053,1708,1506],{"class":1113},[1053,1710,1711],{"class":1544}," status",[1053,1713,1530],{"class":1113},[1053,1715,1627],{"class":1538},[1053,1717,1422],{"class":1113},[1053,1719,1720],{"class":1632},"HTTP_400_BAD_REQUEST",[1053,1722,1558],{"class":1113},[1053,1724,1726],{"class":1055,"line":1725},20,[1053,1727,1488],{"class":1074},[1053,1729,1731,1733,1736,1738,1740,1742,1744,1746,1749,1751,1755],{"class":1055,"line":1730},21,[1053,1732,1493],{"class":1455},[1053,1734,1735],{"class":1496}," retrieve",[1053,1737,1463],{"class":1113},[1053,1739,1503],{"class":1502},[1053,1741,1506],{"class":1113},[1053,1743,1510],{"class":1509},[1053,1745,1506],{"class":1113},[1053,1747,1748],{"class":1509}," pk",[1053,1750,1530],{"class":1070},[1053,1752,1754],{"class":1753},"s8XtY","None",[1053,1756,1470],{"class":1113},[1053,1758,1760,1762,1765],{"class":1055,"line":1759},22,[1053,1761,1517],{"class":1475},[1053,1763,1764],{"class":1479},"GET /api/v1/users/{id}/ - Get specific user",[1053,1766,1483],{"class":1475},[1053,1768,1770,1773],{"class":1055,"line":1769},23,[1053,1771,1772],{"class":1402},"        try",[1053,1774,1775],{"class":1113},":\n",[1053,1777,1779,1781,1783,1785,1787,1790],{"class":1055,"line":1778},24,[1053,1780,1579],{"class":1074},[1053,1782,1530],{"class":1113},[1053,1784,1533],{"class":1066},[1053,1786,1422],{"class":1113},[1053,1788,1789],{"class":1538},"get_object",[1053,1791,1591],{"class":1113},[1053,1793,1795,1798,1800,1802,1804,1806,1808,1810],{"class":1055,"line":1794},25,[1053,1796,1797],{"class":1074},"            serializer ",[1053,1799,1530],{"class":1113},[1053,1801,1533],{"class":1066},[1053,1803,1422],{"class":1113},[1053,1805,1539],{"class":1538},[1053,1807,1463],{"class":1113},[1053,1809,1670],{"class":1538},[1053,1811,1558],{"class":1113},[1053,1813,1815,1817,1819,1821,1823,1825,1827,1829,1831,1833,1835,1837,1840],{"class":1055,"line":1814},26,[1053,1816,1596],{"class":1402},[1053,1818,1599],{"class":1538},[1053,1820,1463],{"class":1113},[1053,1822,1701],{"class":1538},[1053,1824,1422],{"class":1113},[1053,1826,1545],{"class":1555},[1053,1828,1506],{"class":1113},[1053,1830,1711],{"class":1544},[1053,1832,1530],{"class":1113},[1053,1834,1627],{"class":1538},[1053,1836,1422],{"class":1113},[1053,1838,1839],{"class":1632},"HTTP_200_OK",[1053,1841,1558],{"class":1113},[1053,1843,1845,1848,1851,1853,1856],{"class":1055,"line":1844},27,[1053,1846,1847],{"class":1402},"        except",[1053,1849,1850],{"class":1074}," User",[1053,1852,1422],{"class":1113},[1053,1854,1855],{"class":1555},"DoesNotExist",[1053,1857,1775],{"class":1113},[1053,1859,1861,1863,1865],{"class":1055,"line":1860},28,[1053,1862,1596],{"class":1402},[1053,1864,1599],{"class":1538},[1053,1866,1602],{"class":1113},[1053,1868,1870,1873,1875,1878,1880,1882,1885,1888,1890,1893],{"class":1055,"line":1869},29,[1053,1871,1872],{"class":1113},"                {",[1053,1874,1649],{"class":1648},[1053,1876,1877],{"class":1652},"error",[1053,1879,1649],{"class":1648},[1053,1881,1658],{"class":1113},[1053,1883,1884],{"class":1648}," '",[1053,1886,1887],{"class":1652},"User not found",[1053,1889,1649],{"class":1648},[1053,1891,1892],{"class":1113},"},",[1053,1894,1616],{"class":1538},[1053,1896,1898,1900,1902,1904,1906],{"class":1055,"line":1897},30,[1053,1899,1622],{"class":1544},[1053,1901,1530],{"class":1113},[1053,1903,1627],{"class":1538},[1053,1905,1422],{"class":1113},[1053,1907,1908],{"class":1632},"HTTP_404_NOT_FOUND\n",[1053,1910,1912],{"class":1055,"line":1911},31,[1053,1913,1688],{"class":1113},[1053,1915,1917],{"class":1055,"line":1916},32,[1053,1918,1488],{"class":1074},[1053,1920,1922,1924,1927,1929,1931,1933,1935,1937,1939,1941,1943],{"class":1055,"line":1921},33,[1053,1923,1493],{"class":1455},[1053,1925,1926],{"class":1496}," update",[1053,1928,1463],{"class":1113},[1053,1930,1503],{"class":1502},[1053,1932,1506],{"class":1113},[1053,1934,1510],{"class":1509},[1053,1936,1506],{"class":1113},[1053,1938,1748],{"class":1509},[1053,1940,1530],{"class":1070},[1053,1942,1754],{"class":1753},[1053,1944,1470],{"class":1113},[1053,1946,1948,1950,1953],{"class":1055,"line":1947},34,[1053,1949,1517],{"class":1475},[1053,1951,1952],{"class":1479},"PUT /api/v1/users/{id}/ - Full update",[1053,1954,1483],{"class":1475},[1053,1956,1958,1961,1963,1965,1967,1969],{"class":1055,"line":1957},35,[1053,1959,1960],{"class":1074},"        user ",[1053,1962,1530],{"class":1113},[1053,1964,1533],{"class":1066},[1053,1966,1422],{"class":1113},[1053,1968,1789],{"class":1538},[1053,1970,1591],{"class":1113},[1053,1972,1974,1976,1978,1980,1982,1984,1986,1988,1990,1993,1995,1997,1999,2001],{"class":1055,"line":1973},36,[1053,1975,1527],{"class":1074},[1053,1977,1530],{"class":1113},[1053,1979,1533],{"class":1066},[1053,1981,1422],{"class":1113},[1053,1983,1539],{"class":1538},[1053,1985,1463],{"class":1113},[1053,1987,1670],{"class":1538},[1053,1989,1506],{"class":1113},[1053,1991,1992],{"class":1544}," data",[1053,1994,1530],{"class":1113},[1053,1996,1550],{"class":1538},[1053,1998,1422],{"class":1113},[1053,2000,1545],{"class":1555},[1053,2002,1558],{"class":1113},[1053,2004,2006,2008,2010,2012,2014],{"class":1055,"line":2005},37,[1053,2007,1563],{"class":1402},[1053,2009,1566],{"class":1074},[1053,2011,1422],{"class":1113},[1053,2013,1571],{"class":1538},[1053,2015,1574],{"class":1113},[1053,2017,2019,2022,2024,2026],{"class":1055,"line":2018},38,[1053,2020,2021],{"class":1074},"            serializer",[1053,2023,1422],{"class":1113},[1053,2025,1588],{"class":1538},[1053,2027,1591],{"class":1113},[1053,2029,2031,2033,2035,2037,2039,2041,2043,2045,2047,2049,2051,2053,2055],{"class":1055,"line":2030},39,[1053,2032,1596],{"class":1402},[1053,2034,1599],{"class":1538},[1053,2036,1463],{"class":1113},[1053,2038,1701],{"class":1538},[1053,2040,1422],{"class":1113},[1053,2042,1545],{"class":1555},[1053,2044,1506],{"class":1113},[1053,2046,1711],{"class":1544},[1053,2048,1530],{"class":1113},[1053,2050,1627],{"class":1538},[1053,2052,1422],{"class":1113},[1053,2054,1839],{"class":1632},[1053,2056,1558],{"class":1113},[1053,2058,2060,2062,2064,2066,2068,2070,2072,2074,2076,2078,2080,2082,2084],{"class":1055,"line":2059},40,[1053,2061,1694],{"class":1402},[1053,2063,1599],{"class":1538},[1053,2065,1463],{"class":1113},[1053,2067,1701],{"class":1538},[1053,2069,1422],{"class":1113},[1053,2071,1706],{"class":1555},[1053,2073,1506],{"class":1113},[1053,2075,1711],{"class":1544},[1053,2077,1530],{"class":1113},[1053,2079,1627],{"class":1538},[1053,2081,1422],{"class":1113},[1053,2083,1720],{"class":1632},[1053,2085,1558],{"class":1113},[1053,2087,2089],{"class":1055,"line":2088},41,[1053,2090,1488],{"class":1074},[1053,2092,2094,2096,2099,2101,2103,2105,2107,2109,2111,2113,2115],{"class":1055,"line":2093},42,[1053,2095,1493],{"class":1455},[1053,2097,2098],{"class":1496}," partial_update",[1053,2100,1463],{"class":1113},[1053,2102,1503],{"class":1502},[1053,2104,1506],{"class":1113},[1053,2106,1510],{"class":1509},[1053,2108,1506],{"class":1113},[1053,2110,1748],{"class":1509},[1053,2112,1530],{"class":1070},[1053,2114,1754],{"class":1753},[1053,2116,1470],{"class":1113},[1053,2118,2120,2122,2125],{"class":1055,"line":2119},43,[1053,2121,1517],{"class":1475},[1053,2123,2124],{"class":1479},"PATCH /api/v1/users/{id}/ - Partial update",[1053,2126,1483],{"class":1475},[1053,2128,2130,2132,2134,2136,2138,2140],{"class":1055,"line":2129},44,[1053,2131,1960],{"class":1074},[1053,2133,1530],{"class":1113},[1053,2135,1533],{"class":1066},[1053,2137,1422],{"class":1113},[1053,2139,1789],{"class":1538},[1053,2141,1591],{"class":1113},[1053,2143,2145,2147,2149,2151,2153,2155,2157,2159,2161,2163,2165,2167,2169,2171,2173,2176,2178,2181],{"class":1055,"line":2144},45,[1053,2146,1527],{"class":1074},[1053,2148,1530],{"class":1113},[1053,2150,1533],{"class":1066},[1053,2152,1422],{"class":1113},[1053,2154,1539],{"class":1538},[1053,2156,1463],{"class":1113},[1053,2158,1670],{"class":1538},[1053,2160,1506],{"class":1113},[1053,2162,1992],{"class":1544},[1053,2164,1530],{"class":1113},[1053,2166,1550],{"class":1538},[1053,2168,1422],{"class":1113},[1053,2170,1545],{"class":1555},[1053,2172,1506],{"class":1113},[1053,2174,2175],{"class":1544}," partial",[1053,2177,1530],{"class":1113},[1053,2179,2180],{"class":1753},"True",[1053,2182,1558],{"class":1113},[1053,2184,2186,2188,2190,2192,2194],{"class":1055,"line":2185},46,[1053,2187,1563],{"class":1402},[1053,2189,1566],{"class":1074},[1053,2191,1422],{"class":1113},[1053,2193,1571],{"class":1538},[1053,2195,1574],{"class":1113},[1053,2197,2199,2201,2203,2205],{"class":1055,"line":2198},47,[1053,2200,2021],{"class":1074},[1053,2202,1422],{"class":1113},[1053,2204,1588],{"class":1538},[1053,2206,1591],{"class":1113},[1053,2208,2210,2212,2214,2216,2218,2220,2222,2224,2226,2228,2230,2232,2234],{"class":1055,"line":2209},48,[1053,2211,1596],{"class":1402},[1053,2213,1599],{"class":1538},[1053,2215,1463],{"class":1113},[1053,2217,1701],{"class":1538},[1053,2219,1422],{"class":1113},[1053,2221,1545],{"class":1555},[1053,2223,1506],{"class":1113},[1053,2225,1711],{"class":1544},[1053,2227,1530],{"class":1113},[1053,2229,1627],{"class":1538},[1053,2231,1422],{"class":1113},[1053,2233,1839],{"class":1632},[1053,2235,1558],{"class":1113},[1053,2237,2239,2241,2243,2245,2247,2249,2251,2253,2255,2257,2259,2261,2263],{"class":1055,"line":2238},49,[1053,2240,1694],{"class":1402},[1053,2242,1599],{"class":1538},[1053,2244,1463],{"class":1113},[1053,2246,1701],{"class":1538},[1053,2248,1422],{"class":1113},[1053,2250,1706],{"class":1555},[1053,2252,1506],{"class":1113},[1053,2254,1711],{"class":1544},[1053,2256,1530],{"class":1113},[1053,2258,1627],{"class":1538},[1053,2260,1422],{"class":1113},[1053,2262,1720],{"class":1632},[1053,2264,1558],{"class":1113},[1053,2266,2268],{"class":1055,"line":2267},50,[1053,2269,1488],{"class":1074},[1053,2271,2273,2275,2278,2280,2282,2284,2286,2288,2290,2292,2294],{"class":1055,"line":2272},51,[1053,2274,1493],{"class":1455},[1053,2276,2277],{"class":1496}," destroy",[1053,2279,1463],{"class":1113},[1053,2281,1503],{"class":1502},[1053,2283,1506],{"class":1113},[1053,2285,1510],{"class":1509},[1053,2287,1506],{"class":1113},[1053,2289,1748],{"class":1509},[1053,2291,1530],{"class":1070},[1053,2293,1754],{"class":1753},[1053,2295,1470],{"class":1113},[1053,2297,2299,2301,2304],{"class":1055,"line":2298},52,[1053,2300,1517],{"class":1475},[1053,2302,2303],{"class":1479},"DELETE /api/v1/users/{id}/ - Delete user",[1053,2305,1483],{"class":1475},[1053,2307,2309,2311,2313,2315,2317,2319],{"class":1055,"line":2308},53,[1053,2310,1960],{"class":1074},[1053,2312,1530],{"class":1113},[1053,2314,1533],{"class":1066},[1053,2316,1422],{"class":1113},[1053,2318,1789],{"class":1538},[1053,2320,1591],{"class":1113},[1053,2322,2324,2327,2329,2332],{"class":1055,"line":2323},54,[1053,2325,2326],{"class":1074},"        user",[1053,2328,1422],{"class":1113},[1053,2330,2331],{"class":1538},"delete",[1053,2333,1591],{"class":1113},[1053,2335,2337,2339,2341,2343,2345,2347,2349,2351,2354],{"class":1055,"line":2336},55,[1053,2338,1694],{"class":1402},[1053,2340,1599],{"class":1538},[1053,2342,1463],{"class":1113},[1053,2344,1627],{"class":1544},[1053,2346,1530],{"class":1113},[1053,2348,1627],{"class":1538},[1053,2350,1422],{"class":1113},[1053,2352,2353],{"class":1632},"HTTP_204_NO_CONTENT",[1053,2355,1558],{"class":1113},[1035,2357,2359],{"id":2358},"_3-api-versioning","3. API Versioning",[1043,2361,2363],{"className":1045,"code":2362,"language":1047,"meta":1048,"style":1048},"# urls.py - URL-based versioning\nfrom django.urls import path, include\nfrom rest_framework.routers import DefaultRouter\nfrom . import views\n\n# Version 1\nrouter_v1 = DefaultRouter()\nrouter_v1.register(r'users', views.UserViewSetV1)\nrouter_v1.register(r'products', views.ProductViewSetV1)\n\n# Version 2\nrouter_v2 = DefaultRouter()\nrouter_v2.register(r'users', views.UserViewSetV2)\nrouter_v2.register(r'products', views.ProductViewSetV2)\n\nurlpatterns = [\n    path('api/v1/', include(router_v1.urls)),\n    path('api/v2/', include(router_v2.urls)),\n]\n\n# Alternative: Header-based versioning\n# settings.py\nREST_FRAMEWORK = {\n    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.AcceptHeaderVersioning',\n    'DEFAULT_VERSION': 'v1',\n    'ALLOWED_VERSIONS': ['v1', 'v2'],\n    'VERSION_PARAM': 'version',\n}\n\n# Usage in views\nclass UserViewSet(ModelViewSet):\n    def get_serializer_class(self):\n        if self.request.version == 'v2':\n            return UserSerializerV2\n        return UserSerializerV1\n",[1050,2364,2365,2370,2392,2408,2421,2425,2430,2442,2476,2506,2510,2515,2526,2556,2585,2589,2599,2630,2657,2662,2666,2671,2676,2687,2708,2727,2759,2779,2783,2787,2792,2804,2817,2842,2849],{"__ignoreMap":1048},[1053,2366,2367],{"class":1055,"line":1056},[1053,2368,2369],{"class":1059},"# urls.py - URL-based versioning\n",[1053,2371,2372,2374,2377,2379,2382,2384,2387,2389],{"class":1055,"line":1063},[1053,2373,1403],{"class":1402},[1053,2375,2376],{"class":1074}," django",[1053,2378,1422],{"class":1113},[1053,2380,2381],{"class":1074},"urls ",[1053,2383,1409],{"class":1402},[1053,2385,2386],{"class":1074}," path",[1053,2388,1506],{"class":1113},[1053,2390,2391],{"class":1074}," include\n",[1053,2393,2394,2396,2398,2400,2403,2405],{"class":1055,"line":1094},[1053,2395,1403],{"class":1402},[1053,2397,1419],{"class":1074},[1053,2399,1422],{"class":1113},[1053,2401,2402],{"class":1074},"routers ",[1053,2404,1409],{"class":1402},[1053,2406,2407],{"class":1074}," DefaultRouter\n",[1053,2409,2410,2412,2415,2418],{"class":1055,"line":1129},[1053,2411,1403],{"class":1402},[1053,2413,2414],{"class":1113}," .",[1053,2416,2417],{"class":1402}," import",[1053,2419,2420],{"class":1074}," views\n",[1053,2422,2423],{"class":1055,"line":1153},[1053,2424,1220],{"emptyLinePlaceholder":1219},[1053,2426,2427],{"class":1055,"line":1184},[1053,2428,2429],{"class":1059},"# Version 1\n",[1053,2431,2432,2435,2437,2440],{"class":1055,"line":1216},[1053,2433,2434],{"class":1074},"router_v1 ",[1053,2436,1530],{"class":1113},[1053,2438,2439],{"class":1538}," DefaultRouter",[1053,2441,1591],{"class":1113},[1053,2443,2444,2447,2449,2452,2454,2457,2459,2462,2464,2466,2469,2471,2474],{"class":1055,"line":1223},[1053,2445,2446],{"class":1074},"router_v1",[1053,2448,1422],{"class":1113},[1053,2450,2451],{"class":1538},"register",[1053,2453,1463],{"class":1113},[1053,2455,2456],{"class":1455},"r",[1053,2458,1649],{"class":1648},[1053,2460,1086],{"class":2461},"s27EL",[1053,2463,1649],{"class":1648},[1053,2465,1506],{"class":1113},[1053,2467,2468],{"class":1538}," views",[1053,2470,1422],{"class":1113},[1053,2472,2473],{"class":1555},"UserViewSetV1",[1053,2475,1558],{"class":1113},[1053,2477,2478,2480,2482,2484,2486,2488,2490,2493,2495,2497,2499,2501,2504],{"class":1055,"line":1229},[1053,2479,2446],{"class":1074},[1053,2481,1422],{"class":1113},[1053,2483,2451],{"class":1538},[1053,2485,1463],{"class":1113},[1053,2487,2456],{"class":1455},[1053,2489,1649],{"class":1648},[1053,2491,2492],{"class":2461},"products",[1053,2494,1649],{"class":1648},[1053,2496,1506],{"class":1113},[1053,2498,2468],{"class":1538},[1053,2500,1422],{"class":1113},[1053,2502,2503],{"class":1555},"ProductViewSetV1",[1053,2505,1558],{"class":1113},[1053,2507,2508],{"class":1055,"line":1264},[1053,2509,1220],{"emptyLinePlaceholder":1219},[1053,2511,2512],{"class":1055,"line":1298},[1053,2513,2514],{"class":1059},"# Version 2\n",[1053,2516,2517,2520,2522,2524],{"class":1055,"line":1303},[1053,2518,2519],{"class":1074},"router_v2 ",[1053,2521,1530],{"class":1113},[1053,2523,2439],{"class":1538},[1053,2525,1591],{"class":1113},[1053,2527,2528,2531,2533,2535,2537,2539,2541,2543,2545,2547,2549,2551,2554],{"class":1055,"line":1309},[1053,2529,2530],{"class":1074},"router_v2",[1053,2532,1422],{"class":1113},[1053,2534,2451],{"class":1538},[1053,2536,1463],{"class":1113},[1053,2538,2456],{"class":1455},[1053,2540,1649],{"class":1648},[1053,2542,1086],{"class":2461},[1053,2544,1649],{"class":1648},[1053,2546,1506],{"class":1113},[1053,2548,2468],{"class":1538},[1053,2550,1422],{"class":1113},[1053,2552,2553],{"class":1555},"UserViewSetV2",[1053,2555,1558],{"class":1113},[1053,2557,2558,2560,2562,2564,2566,2568,2570,2572,2574,2576,2578,2580,2583],{"class":1055,"line":1330},[1053,2559,2530],{"class":1074},[1053,2561,1422],{"class":1113},[1053,2563,2451],{"class":1538},[1053,2565,1463],{"class":1113},[1053,2567,2456],{"class":1455},[1053,2569,1649],{"class":1648},[1053,2571,2492],{"class":2461},[1053,2573,1649],{"class":1648},[1053,2575,1506],{"class":1113},[1053,2577,2468],{"class":1538},[1053,2579,1422],{"class":1113},[1053,2581,2582],{"class":1555},"ProductViewSetV2",[1053,2584,1558],{"class":1113},[1053,2586,2587],{"class":1055,"line":1358},[1053,2588,1220],{"emptyLinePlaceholder":1219},[1053,2590,2591,2594,2596],{"class":1055,"line":1619},[1053,2592,2593],{"class":1074},"urlpatterns ",[1053,2595,1530],{"class":1113},[1053,2597,2598],{"class":1113}," [\n",[1053,2600,2601,2604,2606,2608,2611,2613,2615,2618,2620,2622,2624,2627],{"class":1055,"line":1639},[1053,2602,2603],{"class":1538},"    path",[1053,2605,1463],{"class":1113},[1053,2607,1649],{"class":1648},[1053,2609,2610],{"class":1652},"api/v1/",[1053,2612,1649],{"class":1648},[1053,2614,1506],{"class":1113},[1053,2616,2617],{"class":1538}," include",[1053,2619,1463],{"class":1113},[1053,2621,2446],{"class":1538},[1053,2623,1422],{"class":1113},[1053,2625,2626],{"class":1555},"urls",[1053,2628,2629],{"class":1113},")),\n",[1053,2631,2632,2634,2636,2638,2641,2643,2645,2647,2649,2651,2653,2655],{"class":1055,"line":1685},[1053,2633,2603],{"class":1538},[1053,2635,1463],{"class":1113},[1053,2637,1649],{"class":1648},[1053,2639,2640],{"class":1652},"api/v2/",[1053,2642,1649],{"class":1648},[1053,2644,1506],{"class":1113},[1053,2646,2617],{"class":1538},[1053,2648,1463],{"class":1113},[1053,2650,2530],{"class":1538},[1053,2652,1422],{"class":1113},[1053,2654,2626],{"class":1555},[1053,2656,2629],{"class":1113},[1053,2658,2659],{"class":1055,"line":1691},[1053,2660,2661],{"class":1113},"]\n",[1053,2663,2664],{"class":1055,"line":1725},[1053,2665,1220],{"emptyLinePlaceholder":1219},[1053,2667,2668],{"class":1055,"line":1730},[1053,2669,2670],{"class":1059},"# Alternative: Header-based versioning\n",[1053,2672,2673],{"class":1055,"line":1759},[1053,2674,2675],{"class":1059},"# settings.py\n",[1053,2677,2678,2681,2684],{"class":1055,"line":1769},[1053,2679,2680],{"class":1066},"REST_FRAMEWORK",[1053,2682,2683],{"class":1113}," =",[1053,2685,2686],{"class":1113}," {\n",[1053,2688,2689,2692,2695,2697,2699,2701,2704,2706],{"class":1055,"line":1778},[1053,2690,2691],{"class":1648},"    '",[1053,2693,2694],{"class":1652},"DEFAULT_VERSIONING_CLASS",[1053,2696,1649],{"class":1648},[1053,2698,1658],{"class":1113},[1053,2700,1884],{"class":1648},[1053,2702,2703],{"class":1652},"rest_framework.versioning.AcceptHeaderVersioning",[1053,2705,1649],{"class":1648},[1053,2707,1636],{"class":1113},[1053,2709,2710,2712,2715,2717,2719,2721,2723,2725],{"class":1055,"line":1794},[1053,2711,2691],{"class":1648},[1053,2713,2714],{"class":1652},"DEFAULT_VERSION",[1053,2716,1649],{"class":1648},[1053,2718,1658],{"class":1113},[1053,2720,1884],{"class":1648},[1053,2722,1081],{"class":1652},[1053,2724,1649],{"class":1648},[1053,2726,1636],{"class":1113},[1053,2728,2729,2731,2734,2736,2738,2741,2743,2745,2747,2749,2751,2754,2756],{"class":1055,"line":1814},[1053,2730,2691],{"class":1648},[1053,2732,2733],{"class":1652},"ALLOWED_VERSIONS",[1053,2735,1649],{"class":1648},[1053,2737,1658],{"class":1113},[1053,2739,2740],{"class":1113}," [",[1053,2742,1649],{"class":1648},[1053,2744,1081],{"class":1652},[1053,2746,1649],{"class":1648},[1053,2748,1506],{"class":1113},[1053,2750,1884],{"class":1648},[1053,2752,2753],{"class":1652},"v2",[1053,2755,1649],{"class":1648},[1053,2757,2758],{"class":1113},"],\n",[1053,2760,2761,2763,2766,2768,2770,2772,2775,2777],{"class":1055,"line":1844},[1053,2762,2691],{"class":1648},[1053,2764,2765],{"class":1652},"VERSION_PARAM",[1053,2767,1649],{"class":1648},[1053,2769,1658],{"class":1113},[1053,2771,1884],{"class":1648},[1053,2773,2774],{"class":1652},"version",[1053,2776,1649],{"class":1648},[1053,2778,1636],{"class":1113},[1053,2780,2781],{"class":1055,"line":1860},[1053,2782,1682],{"class":1113},[1053,2784,2785],{"class":1055,"line":1869},[1053,2786,1220],{"emptyLinePlaceholder":1219},[1053,2788,2789],{"class":1055,"line":1897},[1053,2790,2791],{"class":1059},"# Usage in views\n",[1053,2793,2794,2796,2798,2800,2802],{"class":1055,"line":1911},[1053,2795,1456],{"class":1455},[1053,2797,1460],{"class":1459},[1053,2799,1463],{"class":1113},[1053,2801,1467],{"class":1466},[1053,2803,1470],{"class":1113},[1053,2805,2806,2808,2811,2813,2815],{"class":1055,"line":1916},[1053,2807,1493],{"class":1455},[1053,2809,2810],{"class":1496}," get_serializer_class",[1053,2812,1463],{"class":1113},[1053,2814,1503],{"class":1502},[1053,2816,1470],{"class":1113},[1053,2818,2819,2821,2823,2825,2827,2829,2831,2834,2836,2838,2840],{"class":1055,"line":1921},[1053,2820,1563],{"class":1402},[1053,2822,1533],{"class":1066},[1053,2824,1422],{"class":1113},[1053,2826,1550],{"class":1555},[1053,2828,1422],{"class":1113},[1053,2830,2774],{"class":1555},[1053,2832,2833],{"class":1070}," ==",[1053,2835,1884],{"class":1648},[1053,2837,2753],{"class":1652},[1053,2839,1649],{"class":1648},[1053,2841,1775],{"class":1113},[1053,2843,2844,2846],{"class":1055,"line":1947},[1053,2845,1596],{"class":1402},[1053,2847,2848],{"class":1074}," UserSerializerV2\n",[1053,2850,2851,2853],{"class":1055,"line":1957},[1053,2852,1694],{"class":1402},[1053,2854,2855],{"class":1074}," UserSerializerV1\n",[1030,2857,2859],{"id":2858},"advanced-api-features","Advanced API Features",[1035,2861,2863],{"id":2862},"_1-filtering-searching-and-ordering","1. Filtering, Searching, and Ordering",[1043,2865,2867],{"className":1045,"code":2866,"language":1047,"meta":1048,"style":1048},"# filters.py\nimport django_filters\nfrom django_filters import rest_framework as filters\nfrom .models import User, Product\n\nclass UserFilter(filters.FilterSet):\n    \"\"\"Advanced filtering for users\"\"\"\n    username = filters.CharFilter(lookup_expr='icontains')\n    email = filters.CharFilter(lookup_expr='icontains')\n    is_active = filters.BooleanFilter()\n    created_after = filters.DateTimeFilter(field_name='created_at', lookup_expr='gte')\n    created_before = filters.DateTimeFilter(field_name='created_at', lookup_expr='lte')\n    age_min = filters.NumberFilter(method='filter_age_min')\n    age_max = filters.NumberFilter(method='filter_age_max')\n    \n    class Meta:\n        model = User\n        fields = ['username', 'email', 'is_active', 'created_after', 'created_before']\n    \n    def filter_age_min(self, queryset, name, value):\n        from datetime import date, timedelta\n        max_birth_date = date.today() - timedelta(days=value * 365)\n        return queryset.filter(date_of_birth__lte=max_birth_date)\n    \n    def filter_age_max(self, queryset, name, value):\n        from datetime import date, timedelta\n        min_birth_date = date.today() - timedelta(days=value * 365)\n        return queryset.filter(date_of_birth__gte=min_birth_date)\n\nclass ProductFilter(filters.FilterSet):\n    \"\"\"Product filtering with price ranges\"\"\"\n    name = filters.CharFilter(lookup_expr='icontains')\n    category = filters.CharFilter(field_name='category__name', lookup_expr='icontains')\n    price_min = filters.NumberFilter(field_name='price', lookup_expr='gte')\n    price_max = filters.NumberFilter(field_name='price', lookup_expr='lte')\n    in_stock = filters.BooleanFilter(method='filter_in_stock')\n    \n    class Meta:\n        model = Product\n        fields = ['name', 'category', 'price_min', 'price_max', 'in_stock']\n    \n    def filter_in_stock(self, queryset, name, value):\n        if value:\n            return queryset.filter(inventory_count__gt=0)\n        return queryset.filter(inventory_count=0)\n\n# views.py\nfrom rest_framework import filters\nfrom django_filters.rest_framework import DjangoFilterBackend\n\nclass UserViewSet(ModelViewSet):\n    queryset = User.objects.all()\n    serializer_class = UserSerializer\n    filter_backends = [\n        DjangoFilterBackend,\n        filters.SearchFilter,\n        filters.OrderingFilter\n    ]\n    filterset_class = UserFilter\n    search_fields = ['username', 'email', 'first_name', 'last_name']\n    ordering_fields = ['created_at', 'username', 'email']\n    ordering = ['-created_at']\n    \n    def get_queryset(self):\n        queryset = super().get_queryset()\n        \n        # Custom filtering logic\n        location = self.request.query_params.get('location')\n        if location:\n            queryset = queryset.filter(\n                addresses__city__icontains=location\n            ).distinct()\n        \n        return queryset\n\n# Usage examples:\n# GET /api/v1/users/?username__icontains=john&is_active=true\n# GET /api/v1/users/?search=john&ordering=-created_at\n# GET /api/v1/users/?age_min=18&age_max=65&location=new york\n",[1050,2868,2869,2874,2881,2898,2916,2920,2939,2948,2979,3006,3022,3066,3106,3136,3164,3168,3178,3188,3242,3246,3274,3292,3334,3357,3361,3386,3400,3433,3455,3459,3476,3485,3512,3552,3592,3631,3659,3663,3671,3679,3732,3736,3761,3769,3791,3812,3816,3820,3830,3847,3851,3863,3884,3894,3903,3910,3923,3933,3939,3950,3994,4028,4047,4052,4066,4086,4092,4098,4133,4143,4159,4170,4181,4186,4194,4199,4205,4211,4217],{"__ignoreMap":1048},[1053,2870,2871],{"class":1055,"line":1056},[1053,2872,2873],{"class":1059},"# filters.py\n",[1053,2875,2876,2878],{"class":1055,"line":1063},[1053,2877,1409],{"class":1402},[1053,2879,2880],{"class":1074}," django_filters\n",[1053,2882,2883,2885,2888,2890,2892,2895],{"class":1055,"line":1094},[1053,2884,1403],{"class":1402},[1053,2886,2887],{"class":1074}," django_filters ",[1053,2889,1409],{"class":1402},[1053,2891,1406],{"class":1074},[1053,2893,2894],{"class":1402},"as",[1053,2896,2897],{"class":1074}," filters\n",[1053,2899,2900,2902,2904,2907,2909,2911,2913],{"class":1055,"line":1129},[1053,2901,1403],{"class":1402},[1053,2903,2414],{"class":1113},[1053,2905,2906],{"class":1074},"models ",[1053,2908,1409],{"class":1402},[1053,2910,1850],{"class":1074},[1053,2912,1506],{"class":1113},[1053,2914,2915],{"class":1074}," Product\n",[1053,2917,2918],{"class":1055,"line":1153},[1053,2919,1220],{"emptyLinePlaceholder":1219},[1053,2921,2922,2924,2927,2929,2932,2934,2937],{"class":1055,"line":1184},[1053,2923,1456],{"class":1455},[1053,2925,2926],{"class":1459}," UserFilter",[1053,2928,1463],{"class":1113},[1053,2930,2931],{"class":1466},"filters",[1053,2933,1422],{"class":1113},[1053,2935,2936],{"class":1466},"FilterSet",[1053,2938,1470],{"class":1113},[1053,2940,2941,2943,2946],{"class":1055,"line":1216},[1053,2942,1476],{"class":1475},[1053,2944,2945],{"class":1479},"Advanced filtering for users",[1053,2947,1483],{"class":1475},[1053,2949,2950,2953,2955,2958,2960,2963,2965,2968,2970,2972,2975,2977],{"class":1055,"line":1223},[1053,2951,2952],{"class":1074},"    username ",[1053,2954,1530],{"class":1113},[1053,2956,2957],{"class":1074}," filters",[1053,2959,1422],{"class":1113},[1053,2961,2962],{"class":1538},"CharFilter",[1053,2964,1463],{"class":1113},[1053,2966,2967],{"class":1544},"lookup_expr",[1053,2969,1530],{"class":1113},[1053,2971,1649],{"class":1648},[1053,2973,2974],{"class":1652},"icontains",[1053,2976,1649],{"class":1648},[1053,2978,1558],{"class":1113},[1053,2980,2981,2984,2986,2988,2990,2992,2994,2996,2998,3000,3002,3004],{"class":1055,"line":1229},[1053,2982,2983],{"class":1074},"    email ",[1053,2985,1530],{"class":1113},[1053,2987,2957],{"class":1074},[1053,2989,1422],{"class":1113},[1053,2991,2962],{"class":1538},[1053,2993,1463],{"class":1113},[1053,2995,2967],{"class":1544},[1053,2997,1530],{"class":1113},[1053,2999,1649],{"class":1648},[1053,3001,2974],{"class":1652},[1053,3003,1649],{"class":1648},[1053,3005,1558],{"class":1113},[1053,3007,3008,3011,3013,3015,3017,3020],{"class":1055,"line":1264},[1053,3009,3010],{"class":1074},"    is_active ",[1053,3012,1530],{"class":1113},[1053,3014,2957],{"class":1074},[1053,3016,1422],{"class":1113},[1053,3018,3019],{"class":1538},"BooleanFilter",[1053,3021,1591],{"class":1113},[1053,3023,3024,3027,3029,3031,3033,3036,3038,3041,3043,3045,3048,3050,3052,3055,3057,3059,3062,3064],{"class":1055,"line":1298},[1053,3025,3026],{"class":1074},"    created_after ",[1053,3028,1530],{"class":1113},[1053,3030,2957],{"class":1074},[1053,3032,1422],{"class":1113},[1053,3034,3035],{"class":1538},"DateTimeFilter",[1053,3037,1463],{"class":1113},[1053,3039,3040],{"class":1544},"field_name",[1053,3042,1530],{"class":1113},[1053,3044,1649],{"class":1648},[1053,3046,3047],{"class":1652},"created_at",[1053,3049,1649],{"class":1648},[1053,3051,1506],{"class":1113},[1053,3053,3054],{"class":1544}," lookup_expr",[1053,3056,1530],{"class":1113},[1053,3058,1649],{"class":1648},[1053,3060,3061],{"class":1652},"gte",[1053,3063,1649],{"class":1648},[1053,3065,1558],{"class":1113},[1053,3067,3068,3071,3073,3075,3077,3079,3081,3083,3085,3087,3089,3091,3093,3095,3097,3099,3102,3104],{"class":1055,"line":1303},[1053,3069,3070],{"class":1074},"    created_before ",[1053,3072,1530],{"class":1113},[1053,3074,2957],{"class":1074},[1053,3076,1422],{"class":1113},[1053,3078,3035],{"class":1538},[1053,3080,1463],{"class":1113},[1053,3082,3040],{"class":1544},[1053,3084,1530],{"class":1113},[1053,3086,1649],{"class":1648},[1053,3088,3047],{"class":1652},[1053,3090,1649],{"class":1648},[1053,3092,1506],{"class":1113},[1053,3094,3054],{"class":1544},[1053,3096,1530],{"class":1113},[1053,3098,1649],{"class":1648},[1053,3100,3101],{"class":1652},"lte",[1053,3103,1649],{"class":1648},[1053,3105,1558],{"class":1113},[1053,3107,3108,3111,3113,3115,3117,3120,3122,3125,3127,3129,3132,3134],{"class":1055,"line":1309},[1053,3109,3110],{"class":1074},"    age_min ",[1053,3112,1530],{"class":1113},[1053,3114,2957],{"class":1074},[1053,3116,1422],{"class":1113},[1053,3118,3119],{"class":1538},"NumberFilter",[1053,3121,1463],{"class":1113},[1053,3123,3124],{"class":1544},"method",[1053,3126,1530],{"class":1113},[1053,3128,1649],{"class":1648},[1053,3130,3131],{"class":1652},"filter_age_min",[1053,3133,1649],{"class":1648},[1053,3135,1558],{"class":1113},[1053,3137,3138,3141,3143,3145,3147,3149,3151,3153,3155,3157,3160,3162],{"class":1055,"line":1330},[1053,3139,3140],{"class":1074},"    age_max ",[1053,3142,1530],{"class":1113},[1053,3144,2957],{"class":1074},[1053,3146,1422],{"class":1113},[1053,3148,3119],{"class":1538},[1053,3150,1463],{"class":1113},[1053,3152,3124],{"class":1544},[1053,3154,1530],{"class":1113},[1053,3156,1649],{"class":1648},[1053,3158,3159],{"class":1652},"filter_age_max",[1053,3161,1649],{"class":1648},[1053,3163,1558],{"class":1113},[1053,3165,3166],{"class":1055,"line":1358},[1053,3167,1488],{"class":1074},[1053,3169,3170,3173,3176],{"class":1055,"line":1619},[1053,3171,3172],{"class":1455},"    class",[1053,3174,3175],{"class":1459}," Meta",[1053,3177,1775],{"class":1113},[1053,3179,3180,3183,3185],{"class":1055,"line":1639},[1053,3181,3182],{"class":1074},"        model ",[1053,3184,1530],{"class":1113},[1053,3186,3187],{"class":1074}," User\n",[1053,3189,3190,3193,3195,3197,3199,3202,3204,3206,3208,3211,3213,3215,3217,3220,3222,3224,3226,3229,3231,3233,3235,3238,3240],{"class":1055,"line":1685},[1053,3191,3192],{"class":1074},"        fields ",[1053,3194,1530],{"class":1113},[1053,3196,2740],{"class":1113},[1053,3198,1649],{"class":1648},[1053,3200,3201],{"class":1652},"username",[1053,3203,1649],{"class":1648},[1053,3205,1506],{"class":1113},[1053,3207,1884],{"class":1648},[1053,3209,3210],{"class":1652},"email",[1053,3212,1649],{"class":1648},[1053,3214,1506],{"class":1113},[1053,3216,1884],{"class":1648},[1053,3218,3219],{"class":1652},"is_active",[1053,3221,1649],{"class":1648},[1053,3223,1506],{"class":1113},[1053,3225,1884],{"class":1648},[1053,3227,3228],{"class":1652},"created_after",[1053,3230,1649],{"class":1648},[1053,3232,1506],{"class":1113},[1053,3234,1884],{"class":1648},[1053,3236,3237],{"class":1652},"created_before",[1053,3239,1649],{"class":1648},[1053,3241,2661],{"class":1113},[1053,3243,3244],{"class":1055,"line":1691},[1053,3245,1488],{"class":1074},[1053,3247,3248,3250,3253,3255,3257,3259,3262,3264,3267,3269,3272],{"class":1055,"line":1725},[1053,3249,1493],{"class":1455},[1053,3251,3252],{"class":1496}," filter_age_min",[1053,3254,1463],{"class":1113},[1053,3256,1503],{"class":1502},[1053,3258,1506],{"class":1113},[1053,3260,3261],{"class":1509}," queryset",[1053,3263,1506],{"class":1113},[1053,3265,3266],{"class":1509}," name",[1053,3268,1506],{"class":1113},[1053,3270,3271],{"class":1509}," value",[1053,3273,1470],{"class":1113},[1053,3275,3276,3279,3282,3284,3287,3289],{"class":1055,"line":1730},[1053,3277,3278],{"class":1402},"        from",[1053,3280,3281],{"class":1074}," datetime ",[1053,3283,1409],{"class":1402},[1053,3285,3286],{"class":1074}," date",[1053,3288,1506],{"class":1113},[1053,3290,3291],{"class":1074}," timedelta\n",[1053,3293,3294,3297,3299,3301,3303,3306,3309,3312,3315,3317,3320,3322,3325,3328,3332],{"class":1055,"line":1759},[1053,3295,3296],{"class":1074},"        max_birth_date ",[1053,3298,1530],{"class":1113},[1053,3300,3286],{"class":1074},[1053,3302,1422],{"class":1113},[1053,3304,3305],{"class":1538},"today",[1053,3307,3308],{"class":1113},"()",[1053,3310,3311],{"class":1070}," -",[1053,3313,3314],{"class":1538}," timedelta",[1053,3316,1463],{"class":1113},[1053,3318,3319],{"class":1544},"days",[1053,3321,1530],{"class":1113},[1053,3323,3324],{"class":1538},"value ",[1053,3326,3327],{"class":1070},"*",[1053,3329,3331],{"class":3330},"s7CZa"," 365",[1053,3333,1558],{"class":1113},[1053,3335,3336,3338,3340,3342,3345,3347,3350,3352,3355],{"class":1055,"line":1769},[1053,3337,1694],{"class":1402},[1053,3339,3261],{"class":1074},[1053,3341,1422],{"class":1113},[1053,3343,3344],{"class":1538},"filter",[1053,3346,1463],{"class":1113},[1053,3348,3349],{"class":1544},"date_of_birth__lte",[1053,3351,1530],{"class":1113},[1053,3353,3354],{"class":1538},"max_birth_date",[1053,3356,1558],{"class":1113},[1053,3358,3359],{"class":1055,"line":1778},[1053,3360,1488],{"class":1074},[1053,3362,3363,3365,3368,3370,3372,3374,3376,3378,3380,3382,3384],{"class":1055,"line":1794},[1053,3364,1493],{"class":1455},[1053,3366,3367],{"class":1496}," filter_age_max",[1053,3369,1463],{"class":1113},[1053,3371,1503],{"class":1502},[1053,3373,1506],{"class":1113},[1053,3375,3261],{"class":1509},[1053,3377,1506],{"class":1113},[1053,3379,3266],{"class":1509},[1053,3381,1506],{"class":1113},[1053,3383,3271],{"class":1509},[1053,3385,1470],{"class":1113},[1053,3387,3388,3390,3392,3394,3396,3398],{"class":1055,"line":1814},[1053,3389,3278],{"class":1402},[1053,3391,3281],{"class":1074},[1053,3393,1409],{"class":1402},[1053,3395,3286],{"class":1074},[1053,3397,1506],{"class":1113},[1053,3399,3291],{"class":1074},[1053,3401,3402,3405,3407,3409,3411,3413,3415,3417,3419,3421,3423,3425,3427,3429,3431],{"class":1055,"line":1844},[1053,3403,3404],{"class":1074},"        min_birth_date ",[1053,3406,1530],{"class":1113},[1053,3408,3286],{"class":1074},[1053,3410,1422],{"class":1113},[1053,3412,3305],{"class":1538},[1053,3414,3308],{"class":1113},[1053,3416,3311],{"class":1070},[1053,3418,3314],{"class":1538},[1053,3420,1463],{"class":1113},[1053,3422,3319],{"class":1544},[1053,3424,1530],{"class":1113},[1053,3426,3324],{"class":1538},[1053,3428,3327],{"class":1070},[1053,3430,3331],{"class":3330},[1053,3432,1558],{"class":1113},[1053,3434,3435,3437,3439,3441,3443,3445,3448,3450,3453],{"class":1055,"line":1860},[1053,3436,1694],{"class":1402},[1053,3438,3261],{"class":1074},[1053,3440,1422],{"class":1113},[1053,3442,3344],{"class":1538},[1053,3444,1463],{"class":1113},[1053,3446,3447],{"class":1544},"date_of_birth__gte",[1053,3449,1530],{"class":1113},[1053,3451,3452],{"class":1538},"min_birth_date",[1053,3454,1558],{"class":1113},[1053,3456,3457],{"class":1055,"line":1869},[1053,3458,1220],{"emptyLinePlaceholder":1219},[1053,3460,3461,3463,3466,3468,3470,3472,3474],{"class":1055,"line":1897},[1053,3462,1456],{"class":1455},[1053,3464,3465],{"class":1459}," ProductFilter",[1053,3467,1463],{"class":1113},[1053,3469,2931],{"class":1466},[1053,3471,1422],{"class":1113},[1053,3473,2936],{"class":1466},[1053,3475,1470],{"class":1113},[1053,3477,3478,3480,3483],{"class":1055,"line":1911},[1053,3479,1476],{"class":1475},[1053,3481,3482],{"class":1479},"Product filtering with price ranges",[1053,3484,1483],{"class":1475},[1053,3486,3487,3490,3492,3494,3496,3498,3500,3502,3504,3506,3508,3510],{"class":1055,"line":1916},[1053,3488,3489],{"class":1074},"    name ",[1053,3491,1530],{"class":1113},[1053,3493,2957],{"class":1074},[1053,3495,1422],{"class":1113},[1053,3497,2962],{"class":1538},[1053,3499,1463],{"class":1113},[1053,3501,2967],{"class":1544},[1053,3503,1530],{"class":1113},[1053,3505,1649],{"class":1648},[1053,3507,2974],{"class":1652},[1053,3509,1649],{"class":1648},[1053,3511,1558],{"class":1113},[1053,3513,3514,3517,3519,3521,3523,3525,3527,3529,3531,3533,3536,3538,3540,3542,3544,3546,3548,3550],{"class":1055,"line":1921},[1053,3515,3516],{"class":1074},"    category ",[1053,3518,1530],{"class":1113},[1053,3520,2957],{"class":1074},[1053,3522,1422],{"class":1113},[1053,3524,2962],{"class":1538},[1053,3526,1463],{"class":1113},[1053,3528,3040],{"class":1544},[1053,3530,1530],{"class":1113},[1053,3532,1649],{"class":1648},[1053,3534,3535],{"class":1652},"category__name",[1053,3537,1649],{"class":1648},[1053,3539,1506],{"class":1113},[1053,3541,3054],{"class":1544},[1053,3543,1530],{"class":1113},[1053,3545,1649],{"class":1648},[1053,3547,2974],{"class":1652},[1053,3549,1649],{"class":1648},[1053,3551,1558],{"class":1113},[1053,3553,3554,3557,3559,3561,3563,3565,3567,3569,3571,3573,3576,3578,3580,3582,3584,3586,3588,3590],{"class":1055,"line":1947},[1053,3555,3556],{"class":1074},"    price_min ",[1053,3558,1530],{"class":1113},[1053,3560,2957],{"class":1074},[1053,3562,1422],{"class":1113},[1053,3564,3119],{"class":1538},[1053,3566,1463],{"class":1113},[1053,3568,3040],{"class":1544},[1053,3570,1530],{"class":1113},[1053,3572,1649],{"class":1648},[1053,3574,3575],{"class":1652},"price",[1053,3577,1649],{"class":1648},[1053,3579,1506],{"class":1113},[1053,3581,3054],{"class":1544},[1053,3583,1530],{"class":1113},[1053,3585,1649],{"class":1648},[1053,3587,3061],{"class":1652},[1053,3589,1649],{"class":1648},[1053,3591,1558],{"class":1113},[1053,3593,3594,3597,3599,3601,3603,3605,3607,3609,3611,3613,3615,3617,3619,3621,3623,3625,3627,3629],{"class":1055,"line":1957},[1053,3595,3596],{"class":1074},"    price_max ",[1053,3598,1530],{"class":1113},[1053,3600,2957],{"class":1074},[1053,3602,1422],{"class":1113},[1053,3604,3119],{"class":1538},[1053,3606,1463],{"class":1113},[1053,3608,3040],{"class":1544},[1053,3610,1530],{"class":1113},[1053,3612,1649],{"class":1648},[1053,3614,3575],{"class":1652},[1053,3616,1649],{"class":1648},[1053,3618,1506],{"class":1113},[1053,3620,3054],{"class":1544},[1053,3622,1530],{"class":1113},[1053,3624,1649],{"class":1648},[1053,3626,3101],{"class":1652},[1053,3628,1649],{"class":1648},[1053,3630,1558],{"class":1113},[1053,3632,3633,3636,3638,3640,3642,3644,3646,3648,3650,3652,3655,3657],{"class":1055,"line":1973},[1053,3634,3635],{"class":1074},"    in_stock ",[1053,3637,1530],{"class":1113},[1053,3639,2957],{"class":1074},[1053,3641,1422],{"class":1113},[1053,3643,3019],{"class":1538},[1053,3645,1463],{"class":1113},[1053,3647,3124],{"class":1544},[1053,3649,1530],{"class":1113},[1053,3651,1649],{"class":1648},[1053,3653,3654],{"class":1652},"filter_in_stock",[1053,3656,1649],{"class":1648},[1053,3658,1558],{"class":1113},[1053,3660,3661],{"class":1055,"line":2005},[1053,3662,1488],{"class":1074},[1053,3664,3665,3667,3669],{"class":1055,"line":2018},[1053,3666,3172],{"class":1455},[1053,3668,3175],{"class":1459},[1053,3670,1775],{"class":1113},[1053,3672,3673,3675,3677],{"class":1055,"line":2030},[1053,3674,3182],{"class":1074},[1053,3676,1530],{"class":1113},[1053,3678,2915],{"class":1074},[1053,3680,3681,3683,3685,3687,3689,3692,3694,3696,3698,3701,3703,3705,3707,3710,3712,3714,3716,3719,3721,3723,3725,3728,3730],{"class":1055,"line":2059},[1053,3682,3192],{"class":1074},[1053,3684,1530],{"class":1113},[1053,3686,2740],{"class":1113},[1053,3688,1649],{"class":1648},[1053,3690,3691],{"class":1652},"name",[1053,3693,1649],{"class":1648},[1053,3695,1506],{"class":1113},[1053,3697,1884],{"class":1648},[1053,3699,3700],{"class":1652},"category",[1053,3702,1649],{"class":1648},[1053,3704,1506],{"class":1113},[1053,3706,1884],{"class":1648},[1053,3708,3709],{"class":1652},"price_min",[1053,3711,1649],{"class":1648},[1053,3713,1506],{"class":1113},[1053,3715,1884],{"class":1648},[1053,3717,3718],{"class":1652},"price_max",[1053,3720,1649],{"class":1648},[1053,3722,1506],{"class":1113},[1053,3724,1884],{"class":1648},[1053,3726,3727],{"class":1652},"in_stock",[1053,3729,1649],{"class":1648},[1053,3731,2661],{"class":1113},[1053,3733,3734],{"class":1055,"line":2088},[1053,3735,1488],{"class":1074},[1053,3737,3738,3740,3743,3745,3747,3749,3751,3753,3755,3757,3759],{"class":1055,"line":2093},[1053,3739,1493],{"class":1455},[1053,3741,3742],{"class":1496}," filter_in_stock",[1053,3744,1463],{"class":1113},[1053,3746,1503],{"class":1502},[1053,3748,1506],{"class":1113},[1053,3750,3261],{"class":1509},[1053,3752,1506],{"class":1113},[1053,3754,3266],{"class":1509},[1053,3756,1506],{"class":1113},[1053,3758,3271],{"class":1509},[1053,3760,1470],{"class":1113},[1053,3762,3763,3765,3767],{"class":1055,"line":2119},[1053,3764,1563],{"class":1402},[1053,3766,3271],{"class":1074},[1053,3768,1775],{"class":1113},[1053,3770,3771,3773,3775,3777,3779,3781,3784,3786,3789],{"class":1055,"line":2129},[1053,3772,1596],{"class":1402},[1053,3774,3261],{"class":1074},[1053,3776,1422],{"class":1113},[1053,3778,3344],{"class":1538},[1053,3780,1463],{"class":1113},[1053,3782,3783],{"class":1544},"inventory_count__gt",[1053,3785,1530],{"class":1113},[1053,3787,3788],{"class":3330},"0",[1053,3790,1558],{"class":1113},[1053,3792,3793,3795,3797,3799,3801,3803,3806,3808,3810],{"class":1055,"line":2144},[1053,3794,1694],{"class":1402},[1053,3796,3261],{"class":1074},[1053,3798,1422],{"class":1113},[1053,3800,3344],{"class":1538},[1053,3802,1463],{"class":1113},[1053,3804,3805],{"class":1544},"inventory_count",[1053,3807,1530],{"class":1113},[1053,3809,3788],{"class":3330},[1053,3811,1558],{"class":1113},[1053,3813,3814],{"class":1055,"line":2185},[1053,3815,1220],{"emptyLinePlaceholder":1219},[1053,3817,3818],{"class":1055,"line":2198},[1053,3819,1397],{"class":1059},[1053,3821,3822,3824,3826,3828],{"class":1055,"line":2209},[1053,3823,1403],{"class":1402},[1053,3825,1406],{"class":1074},[1053,3827,1409],{"class":1402},[1053,3829,2897],{"class":1074},[1053,3831,3832,3834,3837,3839,3842,3844],{"class":1055,"line":2238},[1053,3833,1403],{"class":1402},[1053,3835,3836],{"class":1074}," django_filters",[1053,3838,1422],{"class":1113},[1053,3840,3841],{"class":1074},"rest_framework ",[1053,3843,1409],{"class":1402},[1053,3845,3846],{"class":1074}," DjangoFilterBackend\n",[1053,3848,3849],{"class":1055,"line":2267},[1053,3850,1220],{"emptyLinePlaceholder":1219},[1053,3852,3853,3855,3857,3859,3861],{"class":1055,"line":2272},[1053,3854,1456],{"class":1455},[1053,3856,1460],{"class":1459},[1053,3858,1463],{"class":1113},[1053,3860,1467],{"class":1466},[1053,3862,1470],{"class":1113},[1053,3864,3865,3868,3870,3872,3874,3877,3879,3882],{"class":1055,"line":2298},[1053,3866,3867],{"class":1074},"    queryset ",[1053,3869,1530],{"class":1113},[1053,3871,1850],{"class":1074},[1053,3873,1422],{"class":1113},[1053,3875,3876],{"class":1555},"objects",[1053,3878,1422],{"class":1113},[1053,3880,3881],{"class":1538},"all",[1053,3883,1591],{"class":1113},[1053,3885,3886,3889,3891],{"class":1055,"line":2308},[1053,3887,3888],{"class":1074},"    serializer_class ",[1053,3890,1530],{"class":1113},[1053,3892,3893],{"class":1074}," UserSerializer\n",[1053,3895,3896,3899,3901],{"class":1055,"line":2323},[1053,3897,3898],{"class":1074},"    filter_backends ",[1053,3900,1530],{"class":1113},[1053,3902,2598],{"class":1113},[1053,3904,3905,3908],{"class":1055,"line":2336},[1053,3906,3907],{"class":1074},"        DjangoFilterBackend",[1053,3909,1636],{"class":1113},[1053,3911,3913,3916,3918,3921],{"class":1055,"line":3912},56,[1053,3914,3915],{"class":1074},"        filters",[1053,3917,1422],{"class":1113},[1053,3919,3920],{"class":1555},"SearchFilter",[1053,3922,1636],{"class":1113},[1053,3924,3926,3928,3930],{"class":1055,"line":3925},57,[1053,3927,3915],{"class":1074},[1053,3929,1422],{"class":1113},[1053,3931,3932],{"class":1555},"OrderingFilter\n",[1053,3934,3936],{"class":1055,"line":3935},58,[1053,3937,3938],{"class":1113},"    ]\n",[1053,3940,3942,3945,3947],{"class":1055,"line":3941},59,[1053,3943,3944],{"class":1074},"    filterset_class ",[1053,3946,1530],{"class":1113},[1053,3948,3949],{"class":1074}," UserFilter\n",[1053,3951,3953,3956,3958,3960,3962,3964,3966,3968,3970,3972,3974,3976,3978,3981,3983,3985,3987,3990,3992],{"class":1055,"line":3952},60,[1053,3954,3955],{"class":1074},"    search_fields ",[1053,3957,1530],{"class":1113},[1053,3959,2740],{"class":1113},[1053,3961,1649],{"class":1648},[1053,3963,3201],{"class":1652},[1053,3965,1649],{"class":1648},[1053,3967,1506],{"class":1113},[1053,3969,1884],{"class":1648},[1053,3971,3210],{"class":1652},[1053,3973,1649],{"class":1648},[1053,3975,1506],{"class":1113},[1053,3977,1884],{"class":1648},[1053,3979,3980],{"class":1652},"first_name",[1053,3982,1649],{"class":1648},[1053,3984,1506],{"class":1113},[1053,3986,1884],{"class":1648},[1053,3988,3989],{"class":1652},"last_name",[1053,3991,1649],{"class":1648},[1053,3993,2661],{"class":1113},[1053,3995,3997,4000,4002,4004,4006,4008,4010,4012,4014,4016,4018,4020,4022,4024,4026],{"class":1055,"line":3996},61,[1053,3998,3999],{"class":1074},"    ordering_fields ",[1053,4001,1530],{"class":1113},[1053,4003,2740],{"class":1113},[1053,4005,1649],{"class":1648},[1053,4007,3047],{"class":1652},[1053,4009,1649],{"class":1648},[1053,4011,1506],{"class":1113},[1053,4013,1884],{"class":1648},[1053,4015,3201],{"class":1652},[1053,4017,1649],{"class":1648},[1053,4019,1506],{"class":1113},[1053,4021,1884],{"class":1648},[1053,4023,3210],{"class":1652},[1053,4025,1649],{"class":1648},[1053,4027,2661],{"class":1113},[1053,4029,4031,4034,4036,4038,4040,4043,4045],{"class":1055,"line":4030},62,[1053,4032,4033],{"class":1074},"    ordering ",[1053,4035,1530],{"class":1113},[1053,4037,2740],{"class":1113},[1053,4039,1649],{"class":1648},[1053,4041,4042],{"class":1652},"-created_at",[1053,4044,1649],{"class":1648},[1053,4046,2661],{"class":1113},[1053,4048,4050],{"class":1055,"line":4049},63,[1053,4051,1488],{"class":1074},[1053,4053,4055,4057,4060,4062,4064],{"class":1055,"line":4054},64,[1053,4056,1493],{"class":1455},[1053,4058,4059],{"class":1496}," get_queryset",[1053,4061,1463],{"class":1113},[1053,4063,1503],{"class":1502},[1053,4065,1470],{"class":1113},[1053,4067,4069,4072,4074,4078,4081,4084],{"class":1055,"line":4068},65,[1053,4070,4071],{"class":1074},"        queryset ",[1053,4073,1530],{"class":1113},[1053,4075,4077],{"class":4076},"sa2tF"," super",[1053,4079,4080],{"class":1113},"().",[1053,4082,4083],{"class":1538},"get_queryset",[1053,4085,1591],{"class":1113},[1053,4087,4089],{"class":1055,"line":4088},66,[1053,4090,4091],{"class":1074},"        \n",[1053,4093,4095],{"class":1055,"line":4094},67,[1053,4096,4097],{"class":1059},"        # Custom filtering logic\n",[1053,4099,4101,4104,4106,4108,4110,4112,4114,4117,4119,4122,4124,4126,4129,4131],{"class":1055,"line":4100},68,[1053,4102,4103],{"class":1074},"        location ",[1053,4105,1530],{"class":1113},[1053,4107,1533],{"class":1066},[1053,4109,1422],{"class":1113},[1053,4111,1550],{"class":1555},[1053,4113,1422],{"class":1113},[1053,4115,4116],{"class":1555},"query_params",[1053,4118,1422],{"class":1113},[1053,4120,4121],{"class":1538},"get",[1053,4123,1463],{"class":1113},[1053,4125,1649],{"class":1648},[1053,4127,4128],{"class":1652},"location",[1053,4130,1649],{"class":1648},[1053,4132,1558],{"class":1113},[1053,4134,4136,4138,4141],{"class":1055,"line":4135},69,[1053,4137,1563],{"class":1402},[1053,4139,4140],{"class":1074}," location",[1053,4142,1775],{"class":1113},[1053,4144,4146,4149,4151,4153,4155,4157],{"class":1055,"line":4145},70,[1053,4147,4148],{"class":1074},"            queryset ",[1053,4150,1530],{"class":1113},[1053,4152,3261],{"class":1074},[1053,4154,1422],{"class":1113},[1053,4156,3344],{"class":1538},[1053,4158,1602],{"class":1113},[1053,4160,4162,4165,4167],{"class":1055,"line":4161},71,[1053,4163,4164],{"class":1544},"                addresses__city__icontains",[1053,4166,1530],{"class":1113},[1053,4168,4169],{"class":1538},"location\n",[1053,4171,4173,4176,4179],{"class":1055,"line":4172},72,[1053,4174,4175],{"class":1113},"            ).",[1053,4177,4178],{"class":1538},"distinct",[1053,4180,1591],{"class":1113},[1053,4182,4184],{"class":1055,"line":4183},73,[1053,4185,4091],{"class":1074},[1053,4187,4189,4191],{"class":1055,"line":4188},74,[1053,4190,1694],{"class":1402},[1053,4192,4193],{"class":1074}," queryset\n",[1053,4195,4197],{"class":1055,"line":4196},75,[1053,4198,1220],{"emptyLinePlaceholder":1219},[1053,4200,4202],{"class":1055,"line":4201},76,[1053,4203,4204],{"class":1059},"# Usage examples:\n",[1053,4206,4208],{"class":1055,"line":4207},77,[1053,4209,4210],{"class":1059},"# GET /api/v1/users/?username__icontains=john&is_active=true\n",[1053,4212,4214],{"class":1055,"line":4213},78,[1053,4215,4216],{"class":1059},"# GET /api/v1/users/?search=john&ordering=-created_at\n",[1053,4218,4220],{"class":1055,"line":4219},79,[1053,4221,4222],{"class":1059},"# GET /api/v1/users/?age_min=18&age_max=65&location=new york\n",[1035,4224,4226],{"id":4225},"_2-pagination","2. Pagination",[1043,4228,4230],{"className":1045,"code":4229,"language":1047,"meta":1048,"style":1048},"# pagination.py\nfrom rest_framework.pagination import PageNumberPagination, LimitOffsetPagination\nfrom rest_framework.response import Response\n\nclass CustomPageNumberPagination(PageNumberPagination):\n    page_size = 20\n    page_size_query_param = 'page_size'\n    max_page_size = 100\n    \n    def get_paginated_response(self, data):\n        return Response({\n            'pagination': {\n                'count': self.page.paginator.count,\n                'next': self.get_next_link(),\n                'previous': self.get_previous_link(),\n                'page_size': self.page_size,\n                'total_pages': self.page.paginator.num_pages,\n                'current_page': self.page.number,\n            },\n            'results': data\n        })\n\nclass CursorPagination(PageNumberPagination):\n    \"\"\"Cursor-based pagination for better performance on large datasets\"\"\"\n    page_size = 20\n    ordering = '-created_at'\n    cursor_query_param = 'cursor'\n    page_size_query_param = 'page_size'\n    \n    def get_paginated_response(self, data):\n        return Response({\n            'next': self.get_next_link(),\n            'previous': self.get_previous_link(),\n            'results': data\n        })\n\n# settings.py\nREST_FRAMEWORK = {\n    'DEFAULT_PAGINATION_CLASS': 'myapp.pagination.CustomPageNumberPagination',\n    'PAGE_SIZE': 20\n}\n\n# views.py\nclass UserViewSet(ModelViewSet):\n    pagination_class = CustomPageNumberPagination\n    \n    def list(self, request):\n        \"\"\"Custom list with metadata\"\"\"\n        queryset = self.filter_queryset(self.get_queryset())\n        page = self.paginate_queryset(queryset)\n        \n        if page is not None:\n            serializer = self.get_serializer(page, many=True)\n            response = self.get_paginated_response(serializer.data)\n            \n            # Add metadata\n            response.data['metadata'] = {\n                'total_active_users': User.objects.filter(is_active=True).count(),\n                'total_verified_users': User.objects.filter(is_verified=True).count(),\n                'generated_at': timezone.now().isoformat()\n            }\n            \n            return response\n        \n        serializer = self.get_serializer(queryset, many=True)\n        return Response(serializer.data)\n",[1050,4231,4232,4237,4258,4272,4276,4290,4300,4315,4325,4329,4346,4355,4369,4399,4420,4440,4458,4486,4510,4515,4529,4534,4538,4551,4560,4568,4580,4594,4606,4610,4626,4634,4652,4670,4682,4686,4690,4694,4702,4722,4735,4739,4743,4747,4759,4769,4773,4790,4799,4823,4844,4848,4866,4893,4917,4922,4927,4953,4989,5025,5051,5056,5060,5067,5071,5097],{"__ignoreMap":1048},[1053,4233,4234],{"class":1055,"line":1056},[1053,4235,4236],{"class":1059},"# pagination.py\n",[1053,4238,4239,4241,4243,4245,4248,4250,4253,4255],{"class":1055,"line":1063},[1053,4240,1403],{"class":1402},[1053,4242,1419],{"class":1074},[1053,4244,1422],{"class":1113},[1053,4246,4247],{"class":1074},"pagination ",[1053,4249,1409],{"class":1402},[1053,4251,4252],{"class":1074}," PageNumberPagination",[1053,4254,1506],{"class":1113},[1053,4256,4257],{"class":1074}," LimitOffsetPagination\n",[1053,4259,4260,4262,4264,4266,4268,4270],{"class":1055,"line":1094},[1053,4261,1403],{"class":1402},[1053,4263,1419],{"class":1074},[1053,4265,1422],{"class":1113},[1053,4267,1425],{"class":1074},[1053,4269,1409],{"class":1402},[1053,4271,1430],{"class":1074},[1053,4273,4274],{"class":1055,"line":1129},[1053,4275,1220],{"emptyLinePlaceholder":1219},[1053,4277,4278,4280,4283,4285,4288],{"class":1055,"line":1153},[1053,4279,1456],{"class":1455},[1053,4281,4282],{"class":1459}," CustomPageNumberPagination",[1053,4284,1463],{"class":1113},[1053,4286,4287],{"class":1466},"PageNumberPagination",[1053,4289,1470],{"class":1113},[1053,4291,4292,4295,4297],{"class":1055,"line":1184},[1053,4293,4294],{"class":1074},"    page_size ",[1053,4296,1530],{"class":1113},[1053,4298,4299],{"class":3330}," 20\n",[1053,4301,4302,4305,4307,4309,4312],{"class":1055,"line":1216},[1053,4303,4304],{"class":1074},"    page_size_query_param ",[1053,4306,1530],{"class":1113},[1053,4308,1884],{"class":1648},[1053,4310,4311],{"class":1652},"page_size",[1053,4313,4314],{"class":1648},"'\n",[1053,4316,4317,4320,4322],{"class":1055,"line":1223},[1053,4318,4319],{"class":1074},"    max_page_size ",[1053,4321,1530],{"class":1113},[1053,4323,4324],{"class":3330}," 100\n",[1053,4326,4327],{"class":1055,"line":1229},[1053,4328,1488],{"class":1074},[1053,4330,4331,4333,4336,4338,4340,4342,4344],{"class":1055,"line":1264},[1053,4332,1493],{"class":1455},[1053,4334,4335],{"class":1496}," get_paginated_response",[1053,4337,1463],{"class":1113},[1053,4339,1503],{"class":1502},[1053,4341,1506],{"class":1113},[1053,4343,1992],{"class":1509},[1053,4345,1470],{"class":1113},[1053,4347,4348,4350,4352],{"class":1055,"line":1298},[1053,4349,1694],{"class":1402},[1053,4351,1599],{"class":1538},[1053,4353,4354],{"class":1113},"({\n",[1053,4356,4357,4360,4363,4365,4367],{"class":1055,"line":1303},[1053,4358,4359],{"class":1648},"            '",[1053,4361,4362],{"class":1652},"pagination",[1053,4364,1649],{"class":1648},[1053,4366,1658],{"class":1113},[1053,4368,2686],{"class":1113},[1053,4370,4371,4374,4377,4379,4381,4383,4385,4388,4390,4393,4395,4397],{"class":1055,"line":1309},[1053,4372,4373],{"class":1648},"                '",[1053,4375,4376],{"class":1652},"count",[1053,4378,1649],{"class":1648},[1053,4380,1658],{"class":1113},[1053,4382,1533],{"class":1066},[1053,4384,1422],{"class":1113},[1053,4386,4387],{"class":1555},"page",[1053,4389,1422],{"class":1113},[1053,4391,4392],{"class":1555},"paginator",[1053,4394,1422],{"class":1113},[1053,4396,4376],{"class":1555},[1053,4398,1636],{"class":1113},[1053,4400,4401,4403,4406,4408,4410,4412,4414,4417],{"class":1055,"line":1330},[1053,4402,4373],{"class":1648},[1053,4404,4405],{"class":1652},"next",[1053,4407,1649],{"class":1648},[1053,4409,1658],{"class":1113},[1053,4411,1533],{"class":1066},[1053,4413,1422],{"class":1113},[1053,4415,4416],{"class":1538},"get_next_link",[1053,4418,4419],{"class":1113},"(),\n",[1053,4421,4422,4424,4427,4429,4431,4433,4435,4438],{"class":1055,"line":1358},[1053,4423,4373],{"class":1648},[1053,4425,4426],{"class":1652},"previous",[1053,4428,1649],{"class":1648},[1053,4430,1658],{"class":1113},[1053,4432,1533],{"class":1066},[1053,4434,1422],{"class":1113},[1053,4436,4437],{"class":1538},"get_previous_link",[1053,4439,4419],{"class":1113},[1053,4441,4442,4444,4446,4448,4450,4452,4454,4456],{"class":1055,"line":1619},[1053,4443,4373],{"class":1648},[1053,4445,4311],{"class":1652},[1053,4447,1649],{"class":1648},[1053,4449,1658],{"class":1113},[1053,4451,1533],{"class":1066},[1053,4453,1422],{"class":1113},[1053,4455,4311],{"class":1555},[1053,4457,1636],{"class":1113},[1053,4459,4460,4462,4465,4467,4469,4471,4473,4475,4477,4479,4481,4484],{"class":1055,"line":1639},[1053,4461,4373],{"class":1648},[1053,4463,4464],{"class":1652},"total_pages",[1053,4466,1649],{"class":1648},[1053,4468,1658],{"class":1113},[1053,4470,1533],{"class":1066},[1053,4472,1422],{"class":1113},[1053,4474,4387],{"class":1555},[1053,4476,1422],{"class":1113},[1053,4478,4392],{"class":1555},[1053,4480,1422],{"class":1113},[1053,4482,4483],{"class":1555},"num_pages",[1053,4485,1636],{"class":1113},[1053,4487,4488,4490,4493,4495,4497,4499,4501,4503,4505,4508],{"class":1055,"line":1685},[1053,4489,4373],{"class":1648},[1053,4491,4492],{"class":1652},"current_page",[1053,4494,1649],{"class":1648},[1053,4496,1658],{"class":1113},[1053,4498,1533],{"class":1066},[1053,4500,1422],{"class":1113},[1053,4502,4387],{"class":1555},[1053,4504,1422],{"class":1113},[1053,4506,4507],{"class":1555},"number",[1053,4509,1636],{"class":1113},[1053,4511,4512],{"class":1055,"line":1691},[1053,4513,4514],{"class":1113},"            },\n",[1053,4516,4517,4519,4522,4524,4526],{"class":1055,"line":1725},[1053,4518,4359],{"class":1648},[1053,4520,4521],{"class":1652},"results",[1053,4523,1649],{"class":1648},[1053,4525,1658],{"class":1113},[1053,4527,4528],{"class":1538}," data\n",[1053,4530,4531],{"class":1055,"line":1730},[1053,4532,4533],{"class":1113},"        })\n",[1053,4535,4536],{"class":1055,"line":1759},[1053,4537,1220],{"emptyLinePlaceholder":1219},[1053,4539,4540,4542,4545,4547,4549],{"class":1055,"line":1769},[1053,4541,1456],{"class":1455},[1053,4543,4544],{"class":1459}," CursorPagination",[1053,4546,1463],{"class":1113},[1053,4548,4287],{"class":1466},[1053,4550,1470],{"class":1113},[1053,4552,4553,4555,4558],{"class":1055,"line":1778},[1053,4554,1476],{"class":1475},[1053,4556,4557],{"class":1479},"Cursor-based pagination for better performance on large datasets",[1053,4559,1483],{"class":1475},[1053,4561,4562,4564,4566],{"class":1055,"line":1794},[1053,4563,4294],{"class":1074},[1053,4565,1530],{"class":1113},[1053,4567,4299],{"class":3330},[1053,4569,4570,4572,4574,4576,4578],{"class":1055,"line":1814},[1053,4571,4033],{"class":1074},[1053,4573,1530],{"class":1113},[1053,4575,1884],{"class":1648},[1053,4577,4042],{"class":1652},[1053,4579,4314],{"class":1648},[1053,4581,4582,4585,4587,4589,4592],{"class":1055,"line":1844},[1053,4583,4584],{"class":1074},"    cursor_query_param ",[1053,4586,1530],{"class":1113},[1053,4588,1884],{"class":1648},[1053,4590,4591],{"class":1652},"cursor",[1053,4593,4314],{"class":1648},[1053,4595,4596,4598,4600,4602,4604],{"class":1055,"line":1860},[1053,4597,4304],{"class":1074},[1053,4599,1530],{"class":1113},[1053,4601,1884],{"class":1648},[1053,4603,4311],{"class":1652},[1053,4605,4314],{"class":1648},[1053,4607,4608],{"class":1055,"line":1869},[1053,4609,1488],{"class":1074},[1053,4611,4612,4614,4616,4618,4620,4622,4624],{"class":1055,"line":1897},[1053,4613,1493],{"class":1455},[1053,4615,4335],{"class":1496},[1053,4617,1463],{"class":1113},[1053,4619,1503],{"class":1502},[1053,4621,1506],{"class":1113},[1053,4623,1992],{"class":1509},[1053,4625,1470],{"class":1113},[1053,4627,4628,4630,4632],{"class":1055,"line":1911},[1053,4629,1694],{"class":1402},[1053,4631,1599],{"class":1538},[1053,4633,4354],{"class":1113},[1053,4635,4636,4638,4640,4642,4644,4646,4648,4650],{"class":1055,"line":1916},[1053,4637,4359],{"class":1648},[1053,4639,4405],{"class":1652},[1053,4641,1649],{"class":1648},[1053,4643,1658],{"class":1113},[1053,4645,1533],{"class":1066},[1053,4647,1422],{"class":1113},[1053,4649,4416],{"class":1538},[1053,4651,4419],{"class":1113},[1053,4653,4654,4656,4658,4660,4662,4664,4666,4668],{"class":1055,"line":1921},[1053,4655,4359],{"class":1648},[1053,4657,4426],{"class":1652},[1053,4659,1649],{"class":1648},[1053,4661,1658],{"class":1113},[1053,4663,1533],{"class":1066},[1053,4665,1422],{"class":1113},[1053,4667,4437],{"class":1538},[1053,4669,4419],{"class":1113},[1053,4671,4672,4674,4676,4678,4680],{"class":1055,"line":1947},[1053,4673,4359],{"class":1648},[1053,4675,4521],{"class":1652},[1053,4677,1649],{"class":1648},[1053,4679,1658],{"class":1113},[1053,4681,4528],{"class":1538},[1053,4683,4684],{"class":1055,"line":1957},[1053,4685,4533],{"class":1113},[1053,4687,4688],{"class":1055,"line":1973},[1053,4689,1220],{"emptyLinePlaceholder":1219},[1053,4691,4692],{"class":1055,"line":2005},[1053,4693,2675],{"class":1059},[1053,4695,4696,4698,4700],{"class":1055,"line":2018},[1053,4697,2680],{"class":1066},[1053,4699,2683],{"class":1113},[1053,4701,2686],{"class":1113},[1053,4703,4704,4706,4709,4711,4713,4715,4718,4720],{"class":1055,"line":2030},[1053,4705,2691],{"class":1648},[1053,4707,4708],{"class":1652},"DEFAULT_PAGINATION_CLASS",[1053,4710,1649],{"class":1648},[1053,4712,1658],{"class":1113},[1053,4714,1884],{"class":1648},[1053,4716,4717],{"class":1652},"myapp.pagination.CustomPageNumberPagination",[1053,4719,1649],{"class":1648},[1053,4721,1636],{"class":1113},[1053,4723,4724,4726,4729,4731,4733],{"class":1055,"line":2059},[1053,4725,2691],{"class":1648},[1053,4727,4728],{"class":1652},"PAGE_SIZE",[1053,4730,1649],{"class":1648},[1053,4732,1658],{"class":1113},[1053,4734,4299],{"class":3330},[1053,4736,4737],{"class":1055,"line":2088},[1053,4738,1682],{"class":1113},[1053,4740,4741],{"class":1055,"line":2093},[1053,4742,1220],{"emptyLinePlaceholder":1219},[1053,4744,4745],{"class":1055,"line":2119},[1053,4746,1397],{"class":1059},[1053,4748,4749,4751,4753,4755,4757],{"class":1055,"line":2129},[1053,4750,1456],{"class":1455},[1053,4752,1460],{"class":1459},[1053,4754,1463],{"class":1113},[1053,4756,1467],{"class":1466},[1053,4758,1470],{"class":1113},[1053,4760,4761,4764,4766],{"class":1055,"line":2144},[1053,4762,4763],{"class":1074},"    pagination_class ",[1053,4765,1530],{"class":1113},[1053,4767,4768],{"class":1074}," CustomPageNumberPagination\n",[1053,4770,4771],{"class":1055,"line":2185},[1053,4772,1488],{"class":1074},[1053,4774,4775,4777,4780,4782,4784,4786,4788],{"class":1055,"line":2198},[1053,4776,1493],{"class":1455},[1053,4778,4779],{"class":4076}," list",[1053,4781,1463],{"class":1113},[1053,4783,1503],{"class":1502},[1053,4785,1506],{"class":1113},[1053,4787,1510],{"class":1509},[1053,4789,1470],{"class":1113},[1053,4791,4792,4794,4797],{"class":1055,"line":2209},[1053,4793,1517],{"class":1475},[1053,4795,4796],{"class":1479},"Custom list with metadata",[1053,4798,1483],{"class":1475},[1053,4800,4801,4803,4805,4807,4809,4812,4814,4816,4818,4820],{"class":1055,"line":2238},[1053,4802,4071],{"class":1074},[1053,4804,1530],{"class":1113},[1053,4806,1533],{"class":1066},[1053,4808,1422],{"class":1113},[1053,4810,4811],{"class":1538},"filter_queryset",[1053,4813,1463],{"class":1113},[1053,4815,1503],{"class":1066},[1053,4817,1422],{"class":1113},[1053,4819,4083],{"class":1538},[1053,4821,4822],{"class":1113},"())\n",[1053,4824,4825,4828,4830,4832,4834,4837,4839,4842],{"class":1055,"line":2267},[1053,4826,4827],{"class":1074},"        page ",[1053,4829,1530],{"class":1113},[1053,4831,1533],{"class":1066},[1053,4833,1422],{"class":1113},[1053,4835,4836],{"class":1538},"paginate_queryset",[1053,4838,1463],{"class":1113},[1053,4840,4841],{"class":1538},"queryset",[1053,4843,1558],{"class":1113},[1053,4845,4846],{"class":1055,"line":2272},[1053,4847,4091],{"class":1074},[1053,4849,4850,4852,4855,4858,4861,4864],{"class":1055,"line":2298},[1053,4851,1563],{"class":1402},[1053,4853,4854],{"class":1074}," page ",[1053,4856,4857],{"class":1070},"is",[1053,4859,4860],{"class":1070}," not",[1053,4862,4863],{"class":1753}," None",[1053,4865,1775],{"class":1113},[1053,4867,4868,4870,4872,4874,4876,4878,4880,4882,4884,4887,4889,4891],{"class":1055,"line":2308},[1053,4869,1797],{"class":1074},[1053,4871,1530],{"class":1113},[1053,4873,1533],{"class":1066},[1053,4875,1422],{"class":1113},[1053,4877,1539],{"class":1538},[1053,4879,1463],{"class":1113},[1053,4881,4387],{"class":1538},[1053,4883,1506],{"class":1113},[1053,4885,4886],{"class":1544}," many",[1053,4888,1530],{"class":1113},[1053,4890,2180],{"class":1753},[1053,4892,1558],{"class":1113},[1053,4894,4895,4898,4900,4902,4904,4907,4909,4911,4913,4915],{"class":1055,"line":2323},[1053,4896,4897],{"class":1074},"            response ",[1053,4899,1530],{"class":1113},[1053,4901,1533],{"class":1066},[1053,4903,1422],{"class":1113},[1053,4905,4906],{"class":1538},"get_paginated_response",[1053,4908,1463],{"class":1113},[1053,4910,1701],{"class":1538},[1053,4912,1422],{"class":1113},[1053,4914,1545],{"class":1555},[1053,4916,1558],{"class":1113},[1053,4918,4919],{"class":1055,"line":2336},[1053,4920,4921],{"class":1074},"            \n",[1053,4923,4924],{"class":1055,"line":3912},[1053,4925,4926],{"class":1059},"            # Add metadata\n",[1053,4928,4929,4932,4934,4936,4939,4941,4944,4946,4949,4951],{"class":1055,"line":3925},[1053,4930,4931],{"class":1074},"            response",[1053,4933,1422],{"class":1113},[1053,4935,1545],{"class":1555},[1053,4937,4938],{"class":1113},"[",[1053,4940,1649],{"class":1648},[1053,4942,4943],{"class":1652},"metadata",[1053,4945,1649],{"class":1648},[1053,4947,4948],{"class":1113},"]",[1053,4950,2683],{"class":1113},[1053,4952,2686],{"class":1113},[1053,4954,4955,4957,4960,4962,4964,4966,4968,4970,4972,4974,4976,4978,4980,4982,4985,4987],{"class":1055,"line":3935},[1053,4956,4373],{"class":1648},[1053,4958,4959],{"class":1652},"total_active_users",[1053,4961,1649],{"class":1648},[1053,4963,1658],{"class":1113},[1053,4965,1850],{"class":1074},[1053,4967,1422],{"class":1113},[1053,4969,3876],{"class":1555},[1053,4971,1422],{"class":1113},[1053,4973,3344],{"class":1538},[1053,4975,1463],{"class":1113},[1053,4977,3219],{"class":1544},[1053,4979,1530],{"class":1113},[1053,4981,2180],{"class":1753},[1053,4983,4984],{"class":1113},").",[1053,4986,4376],{"class":1538},[1053,4988,4419],{"class":1113},[1053,4990,4991,4993,4996,4998,5000,5002,5004,5006,5008,5010,5012,5015,5017,5019,5021,5023],{"class":1055,"line":3941},[1053,4992,4373],{"class":1648},[1053,4994,4995],{"class":1652},"total_verified_users",[1053,4997,1649],{"class":1648},[1053,4999,1658],{"class":1113},[1053,5001,1850],{"class":1074},[1053,5003,1422],{"class":1113},[1053,5005,3876],{"class":1555},[1053,5007,1422],{"class":1113},[1053,5009,3344],{"class":1538},[1053,5011,1463],{"class":1113},[1053,5013,5014],{"class":1544},"is_verified",[1053,5016,1530],{"class":1113},[1053,5018,2180],{"class":1753},[1053,5020,4984],{"class":1113},[1053,5022,4376],{"class":1538},[1053,5024,4419],{"class":1113},[1053,5026,5027,5029,5032,5034,5036,5039,5041,5044,5046,5049],{"class":1055,"line":3952},[1053,5028,4373],{"class":1648},[1053,5030,5031],{"class":1652},"generated_at",[1053,5033,1649],{"class":1648},[1053,5035,1658],{"class":1113},[1053,5037,5038],{"class":1074}," timezone",[1053,5040,1422],{"class":1113},[1053,5042,5043],{"class":1538},"now",[1053,5045,4080],{"class":1113},[1053,5047,5048],{"class":1538},"isoformat",[1053,5050,1591],{"class":1113},[1053,5052,5053],{"class":1055,"line":3996},[1053,5054,5055],{"class":1113},"            }\n",[1053,5057,5058],{"class":1055,"line":4030},[1053,5059,4921],{"class":1074},[1053,5061,5062,5064],{"class":1055,"line":4049},[1053,5063,1596],{"class":1402},[1053,5065,5066],{"class":1074}," response\n",[1053,5068,5069],{"class":1055,"line":4054},[1053,5070,4091],{"class":1074},[1053,5072,5073,5075,5077,5079,5081,5083,5085,5087,5089,5091,5093,5095],{"class":1055,"line":4068},[1053,5074,1527],{"class":1074},[1053,5076,1530],{"class":1113},[1053,5078,1533],{"class":1066},[1053,5080,1422],{"class":1113},[1053,5082,1539],{"class":1538},[1053,5084,1463],{"class":1113},[1053,5086,4841],{"class":1538},[1053,5088,1506],{"class":1113},[1053,5090,4886],{"class":1544},[1053,5092,1530],{"class":1113},[1053,5094,2180],{"class":1753},[1053,5096,1558],{"class":1113},[1053,5098,5099,5101,5103,5105,5107,5109,5111],{"class":1055,"line":4088},[1053,5100,1694],{"class":1402},[1053,5102,1599],{"class":1538},[1053,5104,1463],{"class":1113},[1053,5106,1701],{"class":1538},[1053,5108,1422],{"class":1113},[1053,5110,1545],{"class":1555},[1053,5112,1558],{"class":1113},[1035,5114,5116],{"id":5115},"_3-serializer-optimization","3. Serializer Optimization",[1043,5118,5120],{"className":1045,"code":5119,"language":1047,"meta":1048,"style":1048},"# serializers.py\nfrom rest_framework import serializers\nfrom django.contrib.auth import get_user_model\nfrom .models import User, Profile, Order, Product\n\nUser = get_user_model()\n\nclass DynamicFieldsModelSerializer(serializers.ModelSerializer):\n    \"\"\"Serializer that allows dynamic field selection\"\"\"\n    \n    def __init__(self, *args, **kwargs):\n        # Extract fields parameter\n        fields = kwargs.pop('fields', None)\n        exclude = kwargs.pop('exclude', None)\n        \n        super().__init__(*args, **kwargs)\n        \n        if fields is not None:\n            # Drop any fields not specified in the `fields` argument\n            allowed = set(fields)\n            existing = set(self.fields)\n            for field_name in existing - allowed:\n                self.fields.pop(field_name)\n        \n        if exclude is not None:\n            # Remove fields specified in exclude\n            for field_name in exclude:\n                self.fields.pop(field_name, None)\n\nclass UserSerializer(DynamicFieldsModelSerializer):\n    \"\"\"Optimized user serializer with dynamic fields\"\"\"\n    full_name = serializers.SerializerMethodField()\n    orders_count = serializers.SerializerMethodField()\n    profile = serializers.SerializerMethodField()\n    \n    class Meta:\n        model = User\n        fields = [\n            'id', 'username', 'email', 'first_name', 'last_name',\n            'full_name', 'is_active', 'date_joined', 'orders_count', 'profile'\n        ]\n    \n    def get_full_name(self, obj):\n        return f\"{obj.first_name} {obj.last_name}\".strip()\n    \n    def get_orders_count(self, obj):\n        # Use prefetch_related to avoid N+1 queries\n        if hasattr(obj, 'orders_count'):\n            return obj.orders_count\n        return obj.orders.count()\n    \n    def get_profile(self, obj):\n        try:\n            profile = obj.profile\n            return {\n                'bio': profile.bio,\n                'avatar_url': profile.avatar_url,\n                'location': profile.location\n            }\n        except Profile.DoesNotExist:\n            return None\n\nclass UserListSerializer(serializers.ModelSerializer):\n    \"\"\"Lightweight serializer for list views\"\"\"\n    full_name = serializers.SerializerMethodField()\n    \n    class Meta:\n        model = User\n        fields = ['id', 'username', 'email', 'full_name', 'is_active', 'date_joined']\n    \n    def get_full_name(self, obj):\n        return f\"{obj.first_name} {obj.last_name}\".strip()\n\nclass UserDetailSerializer(UserSerializer):\n    \"\"\"Detailed serializer with related data\"\"\"\n    recent_orders = serializers.SerializerMethodField()\n    \n    class Meta(UserSerializer.Meta):\n        fields = UserSerializer.Meta.fields + ['recent_orders']\n    \n    def get_recent_orders(self, obj):\n        recent_orders = obj.orders.order_by('-created_at')[:5]\n        return OrderSerializer(recent_orders, many=True, context=self.context).data\n\n# views.py\nclass UserViewSet(ModelViewSet):\n    queryset = User.objects.all()\n    \n    def get_serializer_class(self):\n        if self.action == 'list':\n            return UserListSerializer\n        elif self.action == 'retrieve':\n            return UserDetailSerializer\n        return UserSerializer\n    \n    def get_queryset(self):\n        queryset = super().get_queryset()\n        \n        # Optimize queries based on action\n        if self.action == 'list':\n            # Only select needed fields for list view\n            queryset = queryset.only(\n                'id', 'username', 'email', 'first_name', 'last_name',\n                'is_active', 'date_joined'\n            )\n            # Add annotation for orders count\n            queryset = queryset.annotate(\n                orders_count=Count('orders')\n            )\n        elif self.action == 'retrieve':\n            # Prefetch related data for detail view\n            queryset = queryset.select_related('profile').prefetch_related(\n                Prefetch('orders', queryset=Order.objects.order_by('-created_at')[:5])\n            )\n        \n        return queryset\n    \n    def get_serializer(self, *args, **kwargs):\n        \"\"\"Support dynamic field selection\"\"\"\n        fields = self.request.query_params.get('fields')\n        if fields:\n            kwargs['fields'] = fields.split(',')\n        \n        exclude = self.request.query_params.get('exclude')\n        if exclude:\n            kwargs['exclude'] = exclude.split(',')\n        \n        return super().get_serializer(*args, **kwargs)\n\n# Usage examples:\n# GET /api/v1/users/?fields=id,username,email\n# GET /api/v1/users/?exclude=orders_count,profile\n",[1050,5121,5122,5127,5138,5159,5185,5189,5201,5205,5224,5233,5237,5266,5271,5300,5328,5332,5356,5360,5375,5380,5396,5415,5437,5456,5460,5475,5480,5493,5515,5519,5533,5542,5559,5574,5589,5593,5601,5609,5617,5659,5703,5708,5712,5730,5770,5774,5791,5796,5817,5828,5844,5848,5865,5871,5885,5891,5911,5930,5946,5950,5962,5969,5973,5990,5999,6013,6017,6025,6033,6089,6093,6109,6145,6149,6163,6172,6187,6191,6208,6238,6243,6261,6296,6335,6340,6345,6358,6377,6382,6395,6418,6426,6449,6457,6464,6469,6482,6497,6502,6508,6529,6535,6551,6594,6611,6616,6622,6638,6659,6664,6685,6691,6720,6766,6771,6776,6783,6788,6814,6824,6855,6865,6900,6905,6936,6945,6978,6983,7008,7013,7018,7024],{"__ignoreMap":1048},[1053,5123,5124],{"class":1055,"line":1056},[1053,5125,5126],{"class":1059},"# serializers.py\n",[1053,5128,5129,5131,5133,5135],{"class":1055,"line":1063},[1053,5130,1403],{"class":1402},[1053,5132,1406],{"class":1074},[1053,5134,1409],{"class":1402},[1053,5136,5137],{"class":1074}," serializers\n",[1053,5139,5140,5142,5144,5146,5149,5151,5154,5156],{"class":1055,"line":1094},[1053,5141,1403],{"class":1402},[1053,5143,2376],{"class":1074},[1053,5145,1422],{"class":1113},[1053,5147,5148],{"class":1074},"contrib",[1053,5150,1422],{"class":1113},[1053,5152,5153],{"class":1074},"auth ",[1053,5155,1409],{"class":1402},[1053,5157,5158],{"class":1074}," get_user_model\n",[1053,5160,5161,5163,5165,5167,5169,5171,5173,5176,5178,5181,5183],{"class":1055,"line":1129},[1053,5162,1403],{"class":1402},[1053,5164,2414],{"class":1113},[1053,5166,2906],{"class":1074},[1053,5168,1409],{"class":1402},[1053,5170,1850],{"class":1074},[1053,5172,1506],{"class":1113},[1053,5174,5175],{"class":1074}," Profile",[1053,5177,1506],{"class":1113},[1053,5179,5180],{"class":1074}," Order",[1053,5182,1506],{"class":1113},[1053,5184,2915],{"class":1074},[1053,5186,5187],{"class":1055,"line":1153},[1053,5188,1220],{"emptyLinePlaceholder":1219},[1053,5190,5191,5194,5196,5199],{"class":1055,"line":1184},[1053,5192,5193],{"class":1074},"User ",[1053,5195,1530],{"class":1113},[1053,5197,5198],{"class":1538}," get_user_model",[1053,5200,1591],{"class":1113},[1053,5202,5203],{"class":1055,"line":1216},[1053,5204,1220],{"emptyLinePlaceholder":1219},[1053,5206,5207,5209,5212,5214,5217,5219,5222],{"class":1055,"line":1223},[1053,5208,1456],{"class":1455},[1053,5210,5211],{"class":1459}," DynamicFieldsModelSerializer",[1053,5213,1463],{"class":1113},[1053,5215,5216],{"class":1466},"serializers",[1053,5218,1422],{"class":1113},[1053,5220,5221],{"class":1466},"ModelSerializer",[1053,5223,1470],{"class":1113},[1053,5225,5226,5228,5231],{"class":1055,"line":1229},[1053,5227,1476],{"class":1475},[1053,5229,5230],{"class":1479},"Serializer that allows dynamic field selection",[1053,5232,1483],{"class":1475},[1053,5234,5235],{"class":1055,"line":1264},[1053,5236,1488],{"class":1074},[1053,5238,5239,5241,5244,5246,5248,5250,5253,5256,5258,5261,5264],{"class":1055,"line":1298},[1053,5240,1493],{"class":1455},[1053,5242,5243],{"class":1117}," __init__",[1053,5245,1463],{"class":1113},[1053,5247,1503],{"class":1502},[1053,5249,1506],{"class":1113},[1053,5251,5252],{"class":1070}," *",[1053,5254,5255],{"class":1509},"args",[1053,5257,1506],{"class":1113},[1053,5259,5260],{"class":1070}," **",[1053,5262,5263],{"class":1509},"kwargs",[1053,5265,1470],{"class":1113},[1053,5267,5268],{"class":1055,"line":1303},[1053,5269,5270],{"class":1059},"        # Extract fields parameter\n",[1053,5272,5273,5275,5277,5280,5282,5285,5287,5289,5292,5294,5296,5298],{"class":1055,"line":1309},[1053,5274,3192],{"class":1074},[1053,5276,1530],{"class":1113},[1053,5278,5279],{"class":1074}," kwargs",[1053,5281,1422],{"class":1113},[1053,5283,5284],{"class":1538},"pop",[1053,5286,1463],{"class":1113},[1053,5288,1649],{"class":1648},[1053,5290,5291],{"class":1652},"fields",[1053,5293,1649],{"class":1648},[1053,5295,1506],{"class":1113},[1053,5297,4863],{"class":1753},[1053,5299,1558],{"class":1113},[1053,5301,5302,5305,5307,5309,5311,5313,5315,5317,5320,5322,5324,5326],{"class":1055,"line":1330},[1053,5303,5304],{"class":1074},"        exclude ",[1053,5306,1530],{"class":1113},[1053,5308,5279],{"class":1074},[1053,5310,1422],{"class":1113},[1053,5312,5284],{"class":1538},[1053,5314,1463],{"class":1113},[1053,5316,1649],{"class":1648},[1053,5318,5319],{"class":1652},"exclude",[1053,5321,1649],{"class":1648},[1053,5323,1506],{"class":1113},[1053,5325,4863],{"class":1753},[1053,5327,1558],{"class":1113},[1053,5329,5330],{"class":1055,"line":1358},[1053,5331,4091],{"class":1074},[1053,5333,5334,5337,5339,5342,5344,5346,5348,5350,5352,5354],{"class":1055,"line":1619},[1053,5335,5336],{"class":4076},"        super",[1053,5338,4080],{"class":1113},[1053,5340,5341],{"class":1117},"__init__",[1053,5343,1463],{"class":1113},[1053,5345,3327],{"class":1070},[1053,5347,5255],{"class":1538},[1053,5349,1506],{"class":1113},[1053,5351,5260],{"class":1070},[1053,5353,5263],{"class":1538},[1053,5355,1558],{"class":1113},[1053,5357,5358],{"class":1055,"line":1639},[1053,5359,4091],{"class":1074},[1053,5361,5362,5364,5367,5369,5371,5373],{"class":1055,"line":1685},[1053,5363,1563],{"class":1402},[1053,5365,5366],{"class":1074}," fields ",[1053,5368,4857],{"class":1070},[1053,5370,4860],{"class":1070},[1053,5372,4863],{"class":1753},[1053,5374,1775],{"class":1113},[1053,5376,5377],{"class":1055,"line":1691},[1053,5378,5379],{"class":1059},"            # Drop any fields not specified in the `fields` argument\n",[1053,5381,5382,5385,5387,5390,5392,5394],{"class":1055,"line":1725},[1053,5383,5384],{"class":1074},"            allowed ",[1053,5386,1530],{"class":1113},[1053,5388,5389],{"class":4076}," set",[1053,5391,1463],{"class":1113},[1053,5393,5291],{"class":1538},[1053,5395,1558],{"class":1113},[1053,5397,5398,5401,5403,5405,5407,5409,5411,5413],{"class":1055,"line":1730},[1053,5399,5400],{"class":1074},"            existing ",[1053,5402,1530],{"class":1113},[1053,5404,5389],{"class":4076},[1053,5406,1463],{"class":1113},[1053,5408,1503],{"class":1066},[1053,5410,1422],{"class":1113},[1053,5412,5291],{"class":1555},[1053,5414,1558],{"class":1113},[1053,5416,5417,5420,5423,5426,5429,5432,5435],{"class":1055,"line":1759},[1053,5418,5419],{"class":1402},"            for",[1053,5421,5422],{"class":1074}," field_name ",[1053,5424,5425],{"class":1402},"in",[1053,5427,5428],{"class":1074}," existing ",[1053,5430,5431],{"class":1070},"-",[1053,5433,5434],{"class":1074}," allowed",[1053,5436,1775],{"class":1113},[1053,5438,5439,5442,5444,5446,5448,5450,5452,5454],{"class":1055,"line":1769},[1053,5440,5441],{"class":1066},"                self",[1053,5443,1422],{"class":1113},[1053,5445,5291],{"class":1555},[1053,5447,1422],{"class":1113},[1053,5449,5284],{"class":1538},[1053,5451,1463],{"class":1113},[1053,5453,3040],{"class":1538},[1053,5455,1558],{"class":1113},[1053,5457,5458],{"class":1055,"line":1778},[1053,5459,4091],{"class":1074},[1053,5461,5462,5464,5467,5469,5471,5473],{"class":1055,"line":1794},[1053,5463,1563],{"class":1402},[1053,5465,5466],{"class":1074}," exclude ",[1053,5468,4857],{"class":1070},[1053,5470,4860],{"class":1070},[1053,5472,4863],{"class":1753},[1053,5474,1775],{"class":1113},[1053,5476,5477],{"class":1055,"line":1814},[1053,5478,5479],{"class":1059},"            # Remove fields specified in exclude\n",[1053,5481,5482,5484,5486,5488,5491],{"class":1055,"line":1844},[1053,5483,5419],{"class":1402},[1053,5485,5422],{"class":1074},[1053,5487,5425],{"class":1402},[1053,5489,5490],{"class":1074}," exclude",[1053,5492,1775],{"class":1113},[1053,5494,5495,5497,5499,5501,5503,5505,5507,5509,5511,5513],{"class":1055,"line":1860},[1053,5496,5441],{"class":1066},[1053,5498,1422],{"class":1113},[1053,5500,5291],{"class":1555},[1053,5502,1422],{"class":1113},[1053,5504,5284],{"class":1538},[1053,5506,1463],{"class":1113},[1053,5508,3040],{"class":1538},[1053,5510,1506],{"class":1113},[1053,5512,4863],{"class":1753},[1053,5514,1558],{"class":1113},[1053,5516,5517],{"class":1055,"line":1869},[1053,5518,1220],{"emptyLinePlaceholder":1219},[1053,5520,5521,5523,5526,5528,5531],{"class":1055,"line":1897},[1053,5522,1456],{"class":1455},[1053,5524,5525],{"class":1459}," UserSerializer",[1053,5527,1463],{"class":1113},[1053,5529,5530],{"class":1466},"DynamicFieldsModelSerializer",[1053,5532,1470],{"class":1113},[1053,5534,5535,5537,5540],{"class":1055,"line":1911},[1053,5536,1476],{"class":1475},[1053,5538,5539],{"class":1479},"Optimized user serializer with dynamic fields",[1053,5541,1483],{"class":1475},[1053,5543,5544,5547,5549,5552,5554,5557],{"class":1055,"line":1916},[1053,5545,5546],{"class":1074},"    full_name ",[1053,5548,1530],{"class":1113},[1053,5550,5551],{"class":1074}," serializers",[1053,5553,1422],{"class":1113},[1053,5555,5556],{"class":1538},"SerializerMethodField",[1053,5558,1591],{"class":1113},[1053,5560,5561,5564,5566,5568,5570,5572],{"class":1055,"line":1921},[1053,5562,5563],{"class":1074},"    orders_count ",[1053,5565,1530],{"class":1113},[1053,5567,5551],{"class":1074},[1053,5569,1422],{"class":1113},[1053,5571,5556],{"class":1538},[1053,5573,1591],{"class":1113},[1053,5575,5576,5579,5581,5583,5585,5587],{"class":1055,"line":1947},[1053,5577,5578],{"class":1074},"    profile ",[1053,5580,1530],{"class":1113},[1053,5582,5551],{"class":1074},[1053,5584,1422],{"class":1113},[1053,5586,5556],{"class":1538},[1053,5588,1591],{"class":1113},[1053,5590,5591],{"class":1055,"line":1957},[1053,5592,1488],{"class":1074},[1053,5594,5595,5597,5599],{"class":1055,"line":1973},[1053,5596,3172],{"class":1455},[1053,5598,3175],{"class":1459},[1053,5600,1775],{"class":1113},[1053,5602,5603,5605,5607],{"class":1055,"line":2005},[1053,5604,3182],{"class":1074},[1053,5606,1530],{"class":1113},[1053,5608,3187],{"class":1074},[1053,5610,5611,5613,5615],{"class":1055,"line":2018},[1053,5612,3192],{"class":1074},[1053,5614,1530],{"class":1113},[1053,5616,2598],{"class":1113},[1053,5618,5619,5621,5623,5625,5627,5629,5631,5633,5635,5637,5639,5641,5643,5645,5647,5649,5651,5653,5655,5657],{"class":1055,"line":2030},[1053,5620,4359],{"class":1648},[1053,5622,1118],{"class":1652},[1053,5624,1649],{"class":1648},[1053,5626,1506],{"class":1113},[1053,5628,1884],{"class":1648},[1053,5630,3201],{"class":1652},[1053,5632,1649],{"class":1648},[1053,5634,1506],{"class":1113},[1053,5636,1884],{"class":1648},[1053,5638,3210],{"class":1652},[1053,5640,1649],{"class":1648},[1053,5642,1506],{"class":1113},[1053,5644,1884],{"class":1648},[1053,5646,3980],{"class":1652},[1053,5648,1649],{"class":1648},[1053,5650,1506],{"class":1113},[1053,5652,1884],{"class":1648},[1053,5654,3989],{"class":1652},[1053,5656,1649],{"class":1648},[1053,5658,1636],{"class":1113},[1053,5660,5661,5663,5666,5668,5670,5672,5674,5676,5678,5680,5683,5685,5687,5689,5692,5694,5696,5698,5701],{"class":1055,"line":2059},[1053,5662,4359],{"class":1648},[1053,5664,5665],{"class":1652},"full_name",[1053,5667,1649],{"class":1648},[1053,5669,1506],{"class":1113},[1053,5671,1884],{"class":1648},[1053,5673,3219],{"class":1652},[1053,5675,1649],{"class":1648},[1053,5677,1506],{"class":1113},[1053,5679,1884],{"class":1648},[1053,5681,5682],{"class":1652},"date_joined",[1053,5684,1649],{"class":1648},[1053,5686,1506],{"class":1113},[1053,5688,1884],{"class":1648},[1053,5690,5691],{"class":1652},"orders_count",[1053,5693,1649],{"class":1648},[1053,5695,1506],{"class":1113},[1053,5697,1884],{"class":1648},[1053,5699,5700],{"class":1652},"profile",[1053,5702,4314],{"class":1648},[1053,5704,5705],{"class":1055,"line":2088},[1053,5706,5707],{"class":1113},"        ]\n",[1053,5709,5710],{"class":1055,"line":2093},[1053,5711,1488],{"class":1074},[1053,5713,5714,5716,5719,5721,5723,5725,5728],{"class":1055,"line":2119},[1053,5715,1493],{"class":1455},[1053,5717,5718],{"class":1496}," get_full_name",[1053,5720,1463],{"class":1113},[1053,5722,1503],{"class":1502},[1053,5724,1506],{"class":1113},[1053,5726,5727],{"class":1509}," obj",[1053,5729,1470],{"class":1113},[1053,5731,5732,5734,5736,5739,5741,5744,5746,5748,5750,5753,5755,5757,5759,5761,5763,5765,5768],{"class":1055,"line":2129},[1053,5733,1694],{"class":1402},[1053,5735,1661],{"class":1455},[1053,5737,5738],{"class":1652},"\"",[1053,5740,1114],{"class":1667},[1053,5742,5743],{"class":1074},"obj",[1053,5745,1422],{"class":1113},[1053,5747,3980],{"class":1555},[1053,5749,1121],{"class":1667},[1053,5751,5752],{"class":1667}," {",[1053,5754,5743],{"class":1074},[1053,5756,1422],{"class":1113},[1053,5758,3989],{"class":1555},[1053,5760,1121],{"class":1667},[1053,5762,5738],{"class":1652},[1053,5764,1422],{"class":1113},[1053,5766,5767],{"class":1538},"strip",[1053,5769,1591],{"class":1113},[1053,5771,5772],{"class":1055,"line":2144},[1053,5773,1488],{"class":1074},[1053,5775,5776,5778,5781,5783,5785,5787,5789],{"class":1055,"line":2185},[1053,5777,1493],{"class":1455},[1053,5779,5780],{"class":1496}," get_orders_count",[1053,5782,1463],{"class":1113},[1053,5784,1503],{"class":1502},[1053,5786,1506],{"class":1113},[1053,5788,5727],{"class":1509},[1053,5790,1470],{"class":1113},[1053,5792,5793],{"class":1055,"line":2198},[1053,5794,5795],{"class":1059},"        # Use prefetch_related to avoid N+1 queries\n",[1053,5797,5798,5800,5803,5805,5807,5809,5811,5813,5815],{"class":1055,"line":2209},[1053,5799,1563],{"class":1402},[1053,5801,5802],{"class":1117}," hasattr",[1053,5804,1463],{"class":1113},[1053,5806,5743],{"class":1538},[1053,5808,1506],{"class":1113},[1053,5810,1884],{"class":1648},[1053,5812,5691],{"class":1652},[1053,5814,1649],{"class":1648},[1053,5816,1470],{"class":1113},[1053,5818,5819,5821,5823,5825],{"class":1055,"line":2238},[1053,5820,1596],{"class":1402},[1053,5822,5727],{"class":1074},[1053,5824,1422],{"class":1113},[1053,5826,5827],{"class":1555},"orders_count\n",[1053,5829,5830,5832,5834,5836,5838,5840,5842],{"class":1055,"line":2267},[1053,5831,1694],{"class":1402},[1053,5833,5727],{"class":1074},[1053,5835,1422],{"class":1113},[1053,5837,1256],{"class":1555},[1053,5839,1422],{"class":1113},[1053,5841,4376],{"class":1538},[1053,5843,1591],{"class":1113},[1053,5845,5846],{"class":1055,"line":2272},[1053,5847,1488],{"class":1074},[1053,5849,5850,5852,5855,5857,5859,5861,5863],{"class":1055,"line":2298},[1053,5851,1493],{"class":1455},[1053,5853,5854],{"class":1496}," get_profile",[1053,5856,1463],{"class":1113},[1053,5858,1503],{"class":1502},[1053,5860,1506],{"class":1113},[1053,5862,5727],{"class":1509},[1053,5864,1470],{"class":1113},[1053,5866,5867,5869],{"class":1055,"line":2308},[1053,5868,1772],{"class":1402},[1053,5870,1775],{"class":1113},[1053,5872,5873,5876,5878,5880,5882],{"class":1055,"line":2323},[1053,5874,5875],{"class":1074},"            profile ",[1053,5877,1530],{"class":1113},[1053,5879,5727],{"class":1074},[1053,5881,1422],{"class":1113},[1053,5883,5884],{"class":1555},"profile\n",[1053,5886,5887,5889],{"class":1055,"line":2336},[1053,5888,1596],{"class":1402},[1053,5890,2686],{"class":1113},[1053,5892,5893,5895,5898,5900,5902,5905,5907,5909],{"class":1055,"line":3912},[1053,5894,4373],{"class":1648},[1053,5896,5897],{"class":1652},"bio",[1053,5899,1649],{"class":1648},[1053,5901,1658],{"class":1113},[1053,5903,5904],{"class":1074}," profile",[1053,5906,1422],{"class":1113},[1053,5908,5897],{"class":1555},[1053,5910,1636],{"class":1113},[1053,5912,5913,5915,5918,5920,5922,5924,5926,5928],{"class":1055,"line":3925},[1053,5914,4373],{"class":1648},[1053,5916,5917],{"class":1652},"avatar_url",[1053,5919,1649],{"class":1648},[1053,5921,1658],{"class":1113},[1053,5923,5904],{"class":1074},[1053,5925,1422],{"class":1113},[1053,5927,5917],{"class":1555},[1053,5929,1636],{"class":1113},[1053,5931,5932,5934,5936,5938,5940,5942,5944],{"class":1055,"line":3935},[1053,5933,4373],{"class":1648},[1053,5935,4128],{"class":1652},[1053,5937,1649],{"class":1648},[1053,5939,1658],{"class":1113},[1053,5941,5904],{"class":1074},[1053,5943,1422],{"class":1113},[1053,5945,4169],{"class":1555},[1053,5947,5948],{"class":1055,"line":3941},[1053,5949,5055],{"class":1113},[1053,5951,5952,5954,5956,5958,5960],{"class":1055,"line":3952},[1053,5953,1847],{"class":1402},[1053,5955,5175],{"class":1074},[1053,5957,1422],{"class":1113},[1053,5959,1855],{"class":1555},[1053,5961,1775],{"class":1113},[1053,5963,5964,5966],{"class":1055,"line":3996},[1053,5965,1596],{"class":1402},[1053,5967,5968],{"class":1753}," None\n",[1053,5970,5971],{"class":1055,"line":4030},[1053,5972,1220],{"emptyLinePlaceholder":1219},[1053,5974,5975,5977,5980,5982,5984,5986,5988],{"class":1055,"line":4049},[1053,5976,1456],{"class":1455},[1053,5978,5979],{"class":1459}," UserListSerializer",[1053,5981,1463],{"class":1113},[1053,5983,5216],{"class":1466},[1053,5985,1422],{"class":1113},[1053,5987,5221],{"class":1466},[1053,5989,1470],{"class":1113},[1053,5991,5992,5994,5997],{"class":1055,"line":4054},[1053,5993,1476],{"class":1475},[1053,5995,5996],{"class":1479},"Lightweight serializer for list views",[1053,5998,1483],{"class":1475},[1053,6000,6001,6003,6005,6007,6009,6011],{"class":1055,"line":4068},[1053,6002,5546],{"class":1074},[1053,6004,1530],{"class":1113},[1053,6006,5551],{"class":1074},[1053,6008,1422],{"class":1113},[1053,6010,5556],{"class":1538},[1053,6012,1591],{"class":1113},[1053,6014,6015],{"class":1055,"line":4088},[1053,6016,1488],{"class":1074},[1053,6018,6019,6021,6023],{"class":1055,"line":4094},[1053,6020,3172],{"class":1455},[1053,6022,3175],{"class":1459},[1053,6024,1775],{"class":1113},[1053,6026,6027,6029,6031],{"class":1055,"line":4100},[1053,6028,3182],{"class":1074},[1053,6030,1530],{"class":1113},[1053,6032,3187],{"class":1074},[1053,6034,6035,6037,6039,6041,6043,6045,6047,6049,6051,6053,6055,6057,6059,6061,6063,6065,6067,6069,6071,6073,6075,6077,6079,6081,6083,6085,6087],{"class":1055,"line":4135},[1053,6036,3192],{"class":1074},[1053,6038,1530],{"class":1113},[1053,6040,2740],{"class":1113},[1053,6042,1649],{"class":1648},[1053,6044,1118],{"class":1652},[1053,6046,1649],{"class":1648},[1053,6048,1506],{"class":1113},[1053,6050,1884],{"class":1648},[1053,6052,3201],{"class":1652},[1053,6054,1649],{"class":1648},[1053,6056,1506],{"class":1113},[1053,6058,1884],{"class":1648},[1053,6060,3210],{"class":1652},[1053,6062,1649],{"class":1648},[1053,6064,1506],{"class":1113},[1053,6066,1884],{"class":1648},[1053,6068,5665],{"class":1652},[1053,6070,1649],{"class":1648},[1053,6072,1506],{"class":1113},[1053,6074,1884],{"class":1648},[1053,6076,3219],{"class":1652},[1053,6078,1649],{"class":1648},[1053,6080,1506],{"class":1113},[1053,6082,1884],{"class":1648},[1053,6084,5682],{"class":1652},[1053,6086,1649],{"class":1648},[1053,6088,2661],{"class":1113},[1053,6090,6091],{"class":1055,"line":4145},[1053,6092,1488],{"class":1074},[1053,6094,6095,6097,6099,6101,6103,6105,6107],{"class":1055,"line":4161},[1053,6096,1493],{"class":1455},[1053,6098,5718],{"class":1496},[1053,6100,1463],{"class":1113},[1053,6102,1503],{"class":1502},[1053,6104,1506],{"class":1113},[1053,6106,5727],{"class":1509},[1053,6108,1470],{"class":1113},[1053,6110,6111,6113,6115,6117,6119,6121,6123,6125,6127,6129,6131,6133,6135,6137,6139,6141,6143],{"class":1055,"line":4172},[1053,6112,1694],{"class":1402},[1053,6114,1661],{"class":1455},[1053,6116,5738],{"class":1652},[1053,6118,1114],{"class":1667},[1053,6120,5743],{"class":1074},[1053,6122,1422],{"class":1113},[1053,6124,3980],{"class":1555},[1053,6126,1121],{"class":1667},[1053,6128,5752],{"class":1667},[1053,6130,5743],{"class":1074},[1053,6132,1422],{"class":1113},[1053,6134,3989],{"class":1555},[1053,6136,1121],{"class":1667},[1053,6138,5738],{"class":1652},[1053,6140,1422],{"class":1113},[1053,6142,5767],{"class":1538},[1053,6144,1591],{"class":1113},[1053,6146,6147],{"class":1055,"line":4183},[1053,6148,1220],{"emptyLinePlaceholder":1219},[1053,6150,6151,6153,6156,6158,6161],{"class":1055,"line":4188},[1053,6152,1456],{"class":1455},[1053,6154,6155],{"class":1459}," UserDetailSerializer",[1053,6157,1463],{"class":1113},[1053,6159,6160],{"class":1466},"UserSerializer",[1053,6162,1470],{"class":1113},[1053,6164,6165,6167,6170],{"class":1055,"line":4196},[1053,6166,1476],{"class":1475},[1053,6168,6169],{"class":1479},"Detailed serializer with related data",[1053,6171,1483],{"class":1475},[1053,6173,6174,6177,6179,6181,6183,6185],{"class":1055,"line":4201},[1053,6175,6176],{"class":1074},"    recent_orders ",[1053,6178,1530],{"class":1113},[1053,6180,5551],{"class":1074},[1053,6182,1422],{"class":1113},[1053,6184,5556],{"class":1538},[1053,6186,1591],{"class":1113},[1053,6188,6189],{"class":1055,"line":4207},[1053,6190,1488],{"class":1074},[1053,6192,6193,6195,6197,6199,6201,6203,6206],{"class":1055,"line":4213},[1053,6194,3172],{"class":1455},[1053,6196,3175],{"class":1459},[1053,6198,1463],{"class":1113},[1053,6200,6160],{"class":1466},[1053,6202,1422],{"class":1113},[1053,6204,6205],{"class":1466},"Meta",[1053,6207,1470],{"class":1113},[1053,6209,6210,6212,6214,6216,6218,6220,6222,6224,6227,6229,6231,6234,6236],{"class":1055,"line":4219},[1053,6211,3192],{"class":1074},[1053,6213,1530],{"class":1113},[1053,6215,5525],{"class":1074},[1053,6217,1422],{"class":1113},[1053,6219,6205],{"class":1555},[1053,6221,1422],{"class":1113},[1053,6223,5291],{"class":1555},[1053,6225,6226],{"class":1070}," +",[1053,6228,2740],{"class":1113},[1053,6230,1649],{"class":1648},[1053,6232,6233],{"class":1652},"recent_orders",[1053,6235,1649],{"class":1648},[1053,6237,2661],{"class":1113},[1053,6239,6241],{"class":1055,"line":6240},80,[1053,6242,1488],{"class":1074},[1053,6244,6246,6248,6251,6253,6255,6257,6259],{"class":1055,"line":6245},81,[1053,6247,1493],{"class":1455},[1053,6249,6250],{"class":1496}," get_recent_orders",[1053,6252,1463],{"class":1113},[1053,6254,1503],{"class":1502},[1053,6256,1506],{"class":1113},[1053,6258,5727],{"class":1509},[1053,6260,1470],{"class":1113},[1053,6262,6264,6267,6269,6271,6273,6275,6277,6280,6282,6284,6286,6288,6291,6294],{"class":1055,"line":6263},82,[1053,6265,6266],{"class":1074},"        recent_orders ",[1053,6268,1530],{"class":1113},[1053,6270,5727],{"class":1074},[1053,6272,1422],{"class":1113},[1053,6274,1256],{"class":1555},[1053,6276,1422],{"class":1113},[1053,6278,6279],{"class":1538},"order_by",[1053,6281,1463],{"class":1113},[1053,6283,1649],{"class":1648},[1053,6285,4042],{"class":1652},[1053,6287,1649],{"class":1648},[1053,6289,6290],{"class":1113},")[:",[1053,6292,6293],{"class":3330},"5",[1053,6295,2661],{"class":1113},[1053,6297,6299,6301,6304,6306,6308,6310,6312,6314,6316,6318,6321,6323,6325,6327,6330,6332],{"class":1055,"line":6298},83,[1053,6300,1694],{"class":1402},[1053,6302,6303],{"class":1538}," OrderSerializer",[1053,6305,1463],{"class":1113},[1053,6307,6233],{"class":1538},[1053,6309,1506],{"class":1113},[1053,6311,4886],{"class":1544},[1053,6313,1530],{"class":1113},[1053,6315,2180],{"class":1753},[1053,6317,1506],{"class":1113},[1053,6319,6320],{"class":1544}," context",[1053,6322,1530],{"class":1113},[1053,6324,1503],{"class":1066},[1053,6326,1422],{"class":1113},[1053,6328,6329],{"class":1555},"context",[1053,6331,4984],{"class":1113},[1053,6333,6334],{"class":1555},"data\n",[1053,6336,6338],{"class":1055,"line":6337},84,[1053,6339,1220],{"emptyLinePlaceholder":1219},[1053,6341,6343],{"class":1055,"line":6342},85,[1053,6344,1397],{"class":1059},[1053,6346,6348,6350,6352,6354,6356],{"class":1055,"line":6347},86,[1053,6349,1456],{"class":1455},[1053,6351,1460],{"class":1459},[1053,6353,1463],{"class":1113},[1053,6355,1467],{"class":1466},[1053,6357,1470],{"class":1113},[1053,6359,6361,6363,6365,6367,6369,6371,6373,6375],{"class":1055,"line":6360},87,[1053,6362,3867],{"class":1074},[1053,6364,1530],{"class":1113},[1053,6366,1850],{"class":1074},[1053,6368,1422],{"class":1113},[1053,6370,3876],{"class":1555},[1053,6372,1422],{"class":1113},[1053,6374,3881],{"class":1538},[1053,6376,1591],{"class":1113},[1053,6378,6380],{"class":1055,"line":6379},88,[1053,6381,1488],{"class":1074},[1053,6383,6385,6387,6389,6391,6393],{"class":1055,"line":6384},89,[1053,6386,1493],{"class":1455},[1053,6388,2810],{"class":1496},[1053,6390,1463],{"class":1113},[1053,6392,1503],{"class":1502},[1053,6394,1470],{"class":1113},[1053,6396,6398,6400,6402,6404,6407,6409,6411,6414,6416],{"class":1055,"line":6397},90,[1053,6399,1563],{"class":1402},[1053,6401,1533],{"class":1066},[1053,6403,1422],{"class":1113},[1053,6405,6406],{"class":1555},"action",[1053,6408,2833],{"class":1070},[1053,6410,1884],{"class":1648},[1053,6412,6413],{"class":1652},"list",[1053,6415,1649],{"class":1648},[1053,6417,1775],{"class":1113},[1053,6419,6421,6423],{"class":1055,"line":6420},91,[1053,6422,1596],{"class":1402},[1053,6424,6425],{"class":1074}," UserListSerializer\n",[1053,6427,6429,6432,6434,6436,6438,6440,6442,6445,6447],{"class":1055,"line":6428},92,[1053,6430,6431],{"class":1402},"        elif",[1053,6433,1533],{"class":1066},[1053,6435,1422],{"class":1113},[1053,6437,6406],{"class":1555},[1053,6439,2833],{"class":1070},[1053,6441,1884],{"class":1648},[1053,6443,6444],{"class":1652},"retrieve",[1053,6446,1649],{"class":1648},[1053,6448,1775],{"class":1113},[1053,6450,6452,6454],{"class":1055,"line":6451},93,[1053,6453,1596],{"class":1402},[1053,6455,6456],{"class":1074}," UserDetailSerializer\n",[1053,6458,6460,6462],{"class":1055,"line":6459},94,[1053,6461,1694],{"class":1402},[1053,6463,3893],{"class":1074},[1053,6465,6467],{"class":1055,"line":6466},95,[1053,6468,1488],{"class":1074},[1053,6470,6472,6474,6476,6478,6480],{"class":1055,"line":6471},96,[1053,6473,1493],{"class":1455},[1053,6475,4059],{"class":1496},[1053,6477,1463],{"class":1113},[1053,6479,1503],{"class":1502},[1053,6481,1470],{"class":1113},[1053,6483,6485,6487,6489,6491,6493,6495],{"class":1055,"line":6484},97,[1053,6486,4071],{"class":1074},[1053,6488,1530],{"class":1113},[1053,6490,4077],{"class":4076},[1053,6492,4080],{"class":1113},[1053,6494,4083],{"class":1538},[1053,6496,1591],{"class":1113},[1053,6498,6500],{"class":1055,"line":6499},98,[1053,6501,4091],{"class":1074},[1053,6503,6505],{"class":1055,"line":6504},99,[1053,6506,6507],{"class":1059},"        # Optimize queries based on action\n",[1053,6509,6511,6513,6515,6517,6519,6521,6523,6525,6527],{"class":1055,"line":6510},100,[1053,6512,1563],{"class":1402},[1053,6514,1533],{"class":1066},[1053,6516,1422],{"class":1113},[1053,6518,6406],{"class":1555},[1053,6520,2833],{"class":1070},[1053,6522,1884],{"class":1648},[1053,6524,6413],{"class":1652},[1053,6526,1649],{"class":1648},[1053,6528,1775],{"class":1113},[1053,6530,6532],{"class":1055,"line":6531},101,[1053,6533,6534],{"class":1059},"            # Only select needed fields for list view\n",[1053,6536,6538,6540,6542,6544,6546,6549],{"class":1055,"line":6537},102,[1053,6539,4148],{"class":1074},[1053,6541,1530],{"class":1113},[1053,6543,3261],{"class":1074},[1053,6545,1422],{"class":1113},[1053,6547,6548],{"class":1538},"only",[1053,6550,1602],{"class":1113},[1053,6552,6554,6556,6558,6560,6562,6564,6566,6568,6570,6572,6574,6576,6578,6580,6582,6584,6586,6588,6590,6592],{"class":1055,"line":6553},103,[1053,6555,4373],{"class":1648},[1053,6557,1118],{"class":1652},[1053,6559,1649],{"class":1648},[1053,6561,1506],{"class":1113},[1053,6563,1884],{"class":1648},[1053,6565,3201],{"class":1652},[1053,6567,1649],{"class":1648},[1053,6569,1506],{"class":1113},[1053,6571,1884],{"class":1648},[1053,6573,3210],{"class":1652},[1053,6575,1649],{"class":1648},[1053,6577,1506],{"class":1113},[1053,6579,1884],{"class":1648},[1053,6581,3980],{"class":1652},[1053,6583,1649],{"class":1648},[1053,6585,1506],{"class":1113},[1053,6587,1884],{"class":1648},[1053,6589,3989],{"class":1652},[1053,6591,1649],{"class":1648},[1053,6593,1636],{"class":1113},[1053,6595,6597,6599,6601,6603,6605,6607,6609],{"class":1055,"line":6596},104,[1053,6598,4373],{"class":1648},[1053,6600,3219],{"class":1652},[1053,6602,1649],{"class":1648},[1053,6604,1506],{"class":1113},[1053,6606,1884],{"class":1648},[1053,6608,5682],{"class":1652},[1053,6610,4314],{"class":1648},[1053,6612,6614],{"class":1055,"line":6613},105,[1053,6615,1688],{"class":1113},[1053,6617,6619],{"class":1055,"line":6618},106,[1053,6620,6621],{"class":1059},"            # Add annotation for orders count\n",[1053,6623,6625,6627,6629,6631,6633,6636],{"class":1055,"line":6624},107,[1053,6626,4148],{"class":1074},[1053,6628,1530],{"class":1113},[1053,6630,3261],{"class":1074},[1053,6632,1422],{"class":1113},[1053,6634,6635],{"class":1538},"annotate",[1053,6637,1602],{"class":1113},[1053,6639,6641,6644,6646,6649,6651,6653,6655,6657],{"class":1055,"line":6640},108,[1053,6642,6643],{"class":1544},"                orders_count",[1053,6645,1530],{"class":1113},[1053,6647,6648],{"class":1538},"Count",[1053,6650,1463],{"class":1113},[1053,6652,1649],{"class":1648},[1053,6654,1256],{"class":1652},[1053,6656,1649],{"class":1648},[1053,6658,1558],{"class":1113},[1053,6660,6662],{"class":1055,"line":6661},109,[1053,6663,1688],{"class":1113},[1053,6665,6667,6669,6671,6673,6675,6677,6679,6681,6683],{"class":1055,"line":6666},110,[1053,6668,6431],{"class":1402},[1053,6670,1533],{"class":1066},[1053,6672,1422],{"class":1113},[1053,6674,6406],{"class":1555},[1053,6676,2833],{"class":1070},[1053,6678,1884],{"class":1648},[1053,6680,6444],{"class":1652},[1053,6682,1649],{"class":1648},[1053,6684,1775],{"class":1113},[1053,6686,6688],{"class":1055,"line":6687},111,[1053,6689,6690],{"class":1059},"            # Prefetch related data for detail view\n",[1053,6692,6694,6696,6698,6700,6702,6705,6707,6709,6711,6713,6715,6718],{"class":1055,"line":6693},112,[1053,6695,4148],{"class":1074},[1053,6697,1530],{"class":1113},[1053,6699,3261],{"class":1074},[1053,6701,1422],{"class":1113},[1053,6703,6704],{"class":1538},"select_related",[1053,6706,1463],{"class":1113},[1053,6708,1649],{"class":1648},[1053,6710,5700],{"class":1652},[1053,6712,1649],{"class":1648},[1053,6714,4984],{"class":1113},[1053,6716,6717],{"class":1538},"prefetch_related",[1053,6719,1602],{"class":1113},[1053,6721,6723,6726,6728,6730,6732,6734,6736,6738,6740,6743,6745,6747,6749,6751,6753,6755,6757,6759,6761,6763],{"class":1055,"line":6722},113,[1053,6724,6725],{"class":1538},"                Prefetch",[1053,6727,1463],{"class":1113},[1053,6729,1649],{"class":1648},[1053,6731,1256],{"class":1652},[1053,6733,1649],{"class":1648},[1053,6735,1506],{"class":1113},[1053,6737,3261],{"class":1544},[1053,6739,1530],{"class":1113},[1053,6741,6742],{"class":1538},"Order",[1053,6744,1422],{"class":1113},[1053,6746,3876],{"class":1555},[1053,6748,1422],{"class":1113},[1053,6750,6279],{"class":1538},[1053,6752,1463],{"class":1113},[1053,6754,1649],{"class":1648},[1053,6756,4042],{"class":1652},[1053,6758,1649],{"class":1648},[1053,6760,6290],{"class":1113},[1053,6762,6293],{"class":3330},[1053,6764,6765],{"class":1113},"])\n",[1053,6767,6769],{"class":1055,"line":6768},114,[1053,6770,1688],{"class":1113},[1053,6772,6774],{"class":1055,"line":6773},115,[1053,6775,4091],{"class":1074},[1053,6777,6779,6781],{"class":1055,"line":6778},116,[1053,6780,1694],{"class":1402},[1053,6782,4193],{"class":1074},[1053,6784,6786],{"class":1055,"line":6785},117,[1053,6787,1488],{"class":1074},[1053,6789,6791,6793,6796,6798,6800,6802,6804,6806,6808,6810,6812],{"class":1055,"line":6790},118,[1053,6792,1493],{"class":1455},[1053,6794,6795],{"class":1496}," get_serializer",[1053,6797,1463],{"class":1113},[1053,6799,1503],{"class":1502},[1053,6801,1506],{"class":1113},[1053,6803,5252],{"class":1070},[1053,6805,5255],{"class":1509},[1053,6807,1506],{"class":1113},[1053,6809,5260],{"class":1070},[1053,6811,5263],{"class":1509},[1053,6813,1470],{"class":1113},[1053,6815,6817,6819,6822],{"class":1055,"line":6816},119,[1053,6818,1517],{"class":1475},[1053,6820,6821],{"class":1479},"Support dynamic field selection",[1053,6823,1483],{"class":1475},[1053,6825,6827,6829,6831,6833,6835,6837,6839,6841,6843,6845,6847,6849,6851,6853],{"class":1055,"line":6826},120,[1053,6828,3192],{"class":1074},[1053,6830,1530],{"class":1113},[1053,6832,1533],{"class":1066},[1053,6834,1422],{"class":1113},[1053,6836,1550],{"class":1555},[1053,6838,1422],{"class":1113},[1053,6840,4116],{"class":1555},[1053,6842,1422],{"class":1113},[1053,6844,4121],{"class":1538},[1053,6846,1463],{"class":1113},[1053,6848,1649],{"class":1648},[1053,6850,5291],{"class":1652},[1053,6852,1649],{"class":1648},[1053,6854,1558],{"class":1113},[1053,6856,6858,6860,6863],{"class":1055,"line":6857},121,[1053,6859,1563],{"class":1402},[1053,6861,6862],{"class":1074}," fields",[1053,6864,1775],{"class":1113},[1053,6866,6868,6871,6873,6875,6877,6879,6881,6883,6885,6887,6890,6892,6894,6896,6898],{"class":1055,"line":6867},122,[1053,6869,6870],{"class":1074},"            kwargs",[1053,6872,4938],{"class":1113},[1053,6874,1649],{"class":1648},[1053,6876,5291],{"class":1652},[1053,6878,1649],{"class":1648},[1053,6880,4948],{"class":1113},[1053,6882,2683],{"class":1113},[1053,6884,6862],{"class":1074},[1053,6886,1422],{"class":1113},[1053,6888,6889],{"class":1538},"split",[1053,6891,1463],{"class":1113},[1053,6893,1649],{"class":1648},[1053,6895,1506],{"class":1652},[1053,6897,1649],{"class":1648},[1053,6899,1558],{"class":1113},[1053,6901,6903],{"class":1055,"line":6902},123,[1053,6904,4091],{"class":1074},[1053,6906,6908,6910,6912,6914,6916,6918,6920,6922,6924,6926,6928,6930,6932,6934],{"class":1055,"line":6907},124,[1053,6909,5304],{"class":1074},[1053,6911,1530],{"class":1113},[1053,6913,1533],{"class":1066},[1053,6915,1422],{"class":1113},[1053,6917,1550],{"class":1555},[1053,6919,1422],{"class":1113},[1053,6921,4116],{"class":1555},[1053,6923,1422],{"class":1113},[1053,6925,4121],{"class":1538},[1053,6927,1463],{"class":1113},[1053,6929,1649],{"class":1648},[1053,6931,5319],{"class":1652},[1053,6933,1649],{"class":1648},[1053,6935,1558],{"class":1113},[1053,6937,6939,6941,6943],{"class":1055,"line":6938},125,[1053,6940,1563],{"class":1402},[1053,6942,5490],{"class":1074},[1053,6944,1775],{"class":1113},[1053,6946,6948,6950,6952,6954,6956,6958,6960,6962,6964,6966,6968,6970,6972,6974,6976],{"class":1055,"line":6947},126,[1053,6949,6870],{"class":1074},[1053,6951,4938],{"class":1113},[1053,6953,1649],{"class":1648},[1053,6955,5319],{"class":1652},[1053,6957,1649],{"class":1648},[1053,6959,4948],{"class":1113},[1053,6961,2683],{"class":1113},[1053,6963,5490],{"class":1074},[1053,6965,1422],{"class":1113},[1053,6967,6889],{"class":1538},[1053,6969,1463],{"class":1113},[1053,6971,1649],{"class":1648},[1053,6973,1506],{"class":1652},[1053,6975,1649],{"class":1648},[1053,6977,1558],{"class":1113},[1053,6979,6981],{"class":1055,"line":6980},127,[1053,6982,4091],{"class":1074},[1053,6984,6986,6988,6990,6992,6994,6996,6998,7000,7002,7004,7006],{"class":1055,"line":6985},128,[1053,6987,1694],{"class":1402},[1053,6989,4077],{"class":4076},[1053,6991,4080],{"class":1113},[1053,6993,1539],{"class":1538},[1053,6995,1463],{"class":1113},[1053,6997,3327],{"class":1070},[1053,6999,5255],{"class":1538},[1053,7001,1506],{"class":1113},[1053,7003,5260],{"class":1070},[1053,7005,5263],{"class":1538},[1053,7007,1558],{"class":1113},[1053,7009,7011],{"class":1055,"line":7010},129,[1053,7012,1220],{"emptyLinePlaceholder":1219},[1053,7014,7016],{"class":1055,"line":7015},130,[1053,7017,4204],{"class":1059},[1053,7019,7021],{"class":1055,"line":7020},131,[1053,7022,7023],{"class":1059},"# GET /api/v1/users/?fields=id,username,email\n",[1053,7025,7027],{"class":1055,"line":7026},132,[1053,7028,7029],{"class":1059},"# GET /api/v1/users/?exclude=orders_count,profile\n",[1035,7031,7033],{"id":7032},"_4-api-documentation-with-openapi","4. API Documentation with OpenAPI",[1043,7035,7037],{"className":1045,"code":7036,"language":1047,"meta":1048,"style":1048},"# schema.py\nfrom drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiExample\nfrom drf_spectacular.types import OpenApiTypes\nfrom rest_framework import status\n\nclass UserViewSet(ModelViewSet):\n    \n    @extend_schema(\n        summary=\"List users\",\n        description=\"Retrieve a paginated list of users with filtering and search capabilities\",\n        parameters=[\n            OpenApiParameter(\n                name='search',\n                type=OpenApiTypes.STR,\n                location=OpenApiParameter.QUERY,\n                description='Search in username, email, first_name, last_name'\n            ),\n            OpenApiParameter(\n                name='is_active',\n                type=OpenApiTypes.BOOL,\n                location=OpenApiParameter.QUERY,\n                description='Filter by active status'\n            ),\n            OpenApiParameter(\n                name='created_after',\n                type=OpenApiTypes.DATETIME,\n                location=OpenApiParameter.QUERY,\n                description='Filter users created after this date'\n            ),\n            OpenApiParameter(\n                name='fields',\n                type=OpenApiTypes.STR,\n                location=OpenApiParameter.QUERY,\n                description='Comma-separated list of fields to include'\n            ),\n        ],\n        responses={\n            200: UserListSerializer(many=True),\n            400: OpenApiExample(\n                'Bad Request',\n                value={'error': 'Invalid parameters'},\n                response_only=True\n            )\n        },\n        tags=['Users']\n    )\n    def list(self, request):\n        return super().list(request)\n    \n    @extend_schema(\n        summary=\"Create user\",\n        description=\"Create a new user account\",\n        request=UserSerializer,\n        responses={\n            201: UserSerializer,\n            400: OpenApiExample(\n                'Validation Error',\n                value={\n                    'username': ['This field is required.'],\n                    'email': ['Enter a valid email address.']\n                },\n                response_only=True\n            )\n        },\n        examples=[\n            OpenApiExample(\n                'User Creation',\n                value={\n                    'username': 'johndoe',\n                    'email': 'john@example.com',\n                    'first_name': 'John',\n                    'last_name': 'Doe',\n                    'password': 'securepassword123'\n                },\n                request_only=True\n            )\n        ],\n        tags=['Users']\n    )\n    def create(self, request):\n        return super().create(request)\n\n# settings.py\nINSTALLED_APPS = [\n    # ...\n    'drf_spectacular',\n]\n\nREST_FRAMEWORK = {\n    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',\n}\n\nSPECTACULAR_SETTINGS = {\n    'TITLE': 'Microservices API',\n    'DESCRIPTION': 'RESTful APIs for Django Microservices',\n    'VERSION': '1.0.0',\n    'SERVE_INCLUDE_SCHEMA': False,\n    'COMPONENT_SPLIT_REQUEST': True,\n    'SCHEMA_PATH_PREFIX': '/api/v[0-9]',\n}\n\n# urls.py\nfrom drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView\n\nurlpatterns = [\n    path('api/schema/', SpectacularAPIView.as_view(), name='schema'),\n    path('api/docs/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),\n]\n",[1050,7038,7039,7044,7071,7087,7097,7101,7113,7117,7127,7143,7159,7167,7174,7190,7207,7224,7238,7243,7249,7263,7278,7292,7305,7309,7315,7329,7344,7358,7371,7375,7381,7395,7409,7423,7436,7440,7445,7453,7474,7486,7497,7522,7532,7536,7541,7558,7563,7579,7595,7599,7607,7622,7637,7648,7654,7665,7675,7686,7692,7714,7735,7740,7748,7752,7756,7763,7770,7781,7787,7806,7825,7844,7863,7881,7885,7894,7898,7902,7916,7920,7936,7953,7957,7961,7970,7975,7986,7990,7994,8002,8022,8026,8030,8039,8059,8079,8099,8115,8131,8151,8155,8159,8164,8185,8189,8197,8235,8286],{"__ignoreMap":1048},[1053,7040,7041],{"class":1055,"line":1056},[1053,7042,7043],{"class":1059},"# schema.py\n",[1053,7045,7046,7048,7051,7053,7056,7058,7061,7063,7066,7068],{"class":1055,"line":1063},[1053,7047,1403],{"class":1402},[1053,7049,7050],{"class":1074}," drf_spectacular",[1053,7052,1422],{"class":1113},[1053,7054,7055],{"class":1074},"utils ",[1053,7057,1409],{"class":1402},[1053,7059,7060],{"class":1074}," extend_schema",[1053,7062,1506],{"class":1113},[1053,7064,7065],{"class":1074}," OpenApiParameter",[1053,7067,1506],{"class":1113},[1053,7069,7070],{"class":1074}," OpenApiExample\n",[1053,7072,7073,7075,7077,7079,7082,7084],{"class":1055,"line":1094},[1053,7074,1403],{"class":1402},[1053,7076,7050],{"class":1074},[1053,7078,1422],{"class":1113},[1053,7080,7081],{"class":1074},"types ",[1053,7083,1409],{"class":1402},[1053,7085,7086],{"class":1074}," OpenApiTypes\n",[1053,7088,7089,7091,7093,7095],{"class":1055,"line":1129},[1053,7090,1403],{"class":1402},[1053,7092,1406],{"class":1074},[1053,7094,1409],{"class":1402},[1053,7096,1412],{"class":1074},[1053,7098,7099],{"class":1055,"line":1153},[1053,7100,1220],{"emptyLinePlaceholder":1219},[1053,7102,7103,7105,7107,7109,7111],{"class":1055,"line":1184},[1053,7104,1456],{"class":1455},[1053,7106,1460],{"class":1459},[1053,7108,1463],{"class":1113},[1053,7110,1467],{"class":1466},[1053,7112,1470],{"class":1113},[1053,7114,7115],{"class":1055,"line":1216},[1053,7116,1488],{"class":1074},[1053,7118,7119,7122,7125],{"class":1055,"line":1223},[1053,7120,7121],{"class":1113},"    @",[1053,7123,7124],{"class":1496},"extend_schema",[1053,7126,1602],{"class":1113},[1053,7128,7129,7132,7134,7136,7139,7141],{"class":1055,"line":1229},[1053,7130,7131],{"class":1544},"        summary",[1053,7133,1530],{"class":1113},[1053,7135,5738],{"class":1648},[1053,7137,7138],{"class":1652},"List users",[1053,7140,5738],{"class":1648},[1053,7142,1636],{"class":1113},[1053,7144,7145,7148,7150,7152,7155,7157],{"class":1055,"line":1264},[1053,7146,7147],{"class":1544},"        description",[1053,7149,1530],{"class":1113},[1053,7151,5738],{"class":1648},[1053,7153,7154],{"class":1652},"Retrieve a paginated list of users with filtering and search capabilities",[1053,7156,5738],{"class":1648},[1053,7158,1636],{"class":1113},[1053,7160,7161,7164],{"class":1055,"line":1298},[1053,7162,7163],{"class":1544},"        parameters",[1053,7165,7166],{"class":1113},"=[\n",[1053,7168,7169,7172],{"class":1055,"line":1303},[1053,7170,7171],{"class":1538},"            OpenApiParameter",[1053,7173,1602],{"class":1113},[1053,7175,7176,7179,7181,7183,7186,7188],{"class":1055,"line":1309},[1053,7177,7178],{"class":1544},"                name",[1053,7180,1530],{"class":1113},[1053,7182,1649],{"class":1648},[1053,7184,7185],{"class":1652},"search",[1053,7187,1649],{"class":1648},[1053,7189,1636],{"class":1113},[1053,7191,7192,7195,7197,7200,7202,7205],{"class":1055,"line":1330},[1053,7193,7194],{"class":1544},"                type",[1053,7196,1530],{"class":1113},[1053,7198,7199],{"class":1538},"OpenApiTypes",[1053,7201,1422],{"class":1113},[1053,7203,7204],{"class":1632},"STR",[1053,7206,1636],{"class":1113},[1053,7208,7209,7212,7214,7217,7219,7222],{"class":1055,"line":1358},[1053,7210,7211],{"class":1544},"                location",[1053,7213,1530],{"class":1113},[1053,7215,7216],{"class":1538},"OpenApiParameter",[1053,7218,1422],{"class":1113},[1053,7220,7221],{"class":1632},"QUERY",[1053,7223,1636],{"class":1113},[1053,7225,7226,7229,7231,7233,7236],{"class":1055,"line":1619},[1053,7227,7228],{"class":1544},"                description",[1053,7230,1530],{"class":1113},[1053,7232,1649],{"class":1648},[1053,7234,7235],{"class":1652},"Search in username, email, first_name, last_name",[1053,7237,4314],{"class":1648},[1053,7239,7240],{"class":1055,"line":1639},[1053,7241,7242],{"class":1113},"            ),\n",[1053,7244,7245,7247],{"class":1055,"line":1685},[1053,7246,7171],{"class":1538},[1053,7248,1602],{"class":1113},[1053,7250,7251,7253,7255,7257,7259,7261],{"class":1055,"line":1691},[1053,7252,7178],{"class":1544},[1053,7254,1530],{"class":1113},[1053,7256,1649],{"class":1648},[1053,7258,3219],{"class":1652},[1053,7260,1649],{"class":1648},[1053,7262,1636],{"class":1113},[1053,7264,7265,7267,7269,7271,7273,7276],{"class":1055,"line":1725},[1053,7266,7194],{"class":1544},[1053,7268,1530],{"class":1113},[1053,7270,7199],{"class":1538},[1053,7272,1422],{"class":1113},[1053,7274,7275],{"class":1632},"BOOL",[1053,7277,1636],{"class":1113},[1053,7279,7280,7282,7284,7286,7288,7290],{"class":1055,"line":1730},[1053,7281,7211],{"class":1544},[1053,7283,1530],{"class":1113},[1053,7285,7216],{"class":1538},[1053,7287,1422],{"class":1113},[1053,7289,7221],{"class":1632},[1053,7291,1636],{"class":1113},[1053,7293,7294,7296,7298,7300,7303],{"class":1055,"line":1759},[1053,7295,7228],{"class":1544},[1053,7297,1530],{"class":1113},[1053,7299,1649],{"class":1648},[1053,7301,7302],{"class":1652},"Filter by active status",[1053,7304,4314],{"class":1648},[1053,7306,7307],{"class":1055,"line":1769},[1053,7308,7242],{"class":1113},[1053,7310,7311,7313],{"class":1055,"line":1778},[1053,7312,7171],{"class":1538},[1053,7314,1602],{"class":1113},[1053,7316,7317,7319,7321,7323,7325,7327],{"class":1055,"line":1794},[1053,7318,7178],{"class":1544},[1053,7320,1530],{"class":1113},[1053,7322,1649],{"class":1648},[1053,7324,3228],{"class":1652},[1053,7326,1649],{"class":1648},[1053,7328,1636],{"class":1113},[1053,7330,7331,7333,7335,7337,7339,7342],{"class":1055,"line":1814},[1053,7332,7194],{"class":1544},[1053,7334,1530],{"class":1113},[1053,7336,7199],{"class":1538},[1053,7338,1422],{"class":1113},[1053,7340,7341],{"class":1632},"DATETIME",[1053,7343,1636],{"class":1113},[1053,7345,7346,7348,7350,7352,7354,7356],{"class":1055,"line":1844},[1053,7347,7211],{"class":1544},[1053,7349,1530],{"class":1113},[1053,7351,7216],{"class":1538},[1053,7353,1422],{"class":1113},[1053,7355,7221],{"class":1632},[1053,7357,1636],{"class":1113},[1053,7359,7360,7362,7364,7366,7369],{"class":1055,"line":1860},[1053,7361,7228],{"class":1544},[1053,7363,1530],{"class":1113},[1053,7365,1649],{"class":1648},[1053,7367,7368],{"class":1652},"Filter users created after this date",[1053,7370,4314],{"class":1648},[1053,7372,7373],{"class":1055,"line":1869},[1053,7374,7242],{"class":1113},[1053,7376,7377,7379],{"class":1055,"line":1897},[1053,7378,7171],{"class":1538},[1053,7380,1602],{"class":1113},[1053,7382,7383,7385,7387,7389,7391,7393],{"class":1055,"line":1911},[1053,7384,7178],{"class":1544},[1053,7386,1530],{"class":1113},[1053,7388,1649],{"class":1648},[1053,7390,5291],{"class":1652},[1053,7392,1649],{"class":1648},[1053,7394,1636],{"class":1113},[1053,7396,7397,7399,7401,7403,7405,7407],{"class":1055,"line":1916},[1053,7398,7194],{"class":1544},[1053,7400,1530],{"class":1113},[1053,7402,7199],{"class":1538},[1053,7404,1422],{"class":1113},[1053,7406,7204],{"class":1632},[1053,7408,1636],{"class":1113},[1053,7410,7411,7413,7415,7417,7419,7421],{"class":1055,"line":1921},[1053,7412,7211],{"class":1544},[1053,7414,1530],{"class":1113},[1053,7416,7216],{"class":1538},[1053,7418,1422],{"class":1113},[1053,7420,7221],{"class":1632},[1053,7422,1636],{"class":1113},[1053,7424,7425,7427,7429,7431,7434],{"class":1055,"line":1947},[1053,7426,7228],{"class":1544},[1053,7428,1530],{"class":1113},[1053,7430,1649],{"class":1648},[1053,7432,7433],{"class":1652},"Comma-separated list of fields to include",[1053,7435,4314],{"class":1648},[1053,7437,7438],{"class":1055,"line":1957},[1053,7439,7242],{"class":1113},[1053,7441,7442],{"class":1055,"line":1973},[1053,7443,7444],{"class":1113},"        ],\n",[1053,7446,7447,7450],{"class":1055,"line":2005},[1053,7448,7449],{"class":1544},"        responses",[1053,7451,7452],{"class":1113},"={\n",[1053,7454,7455,7458,7460,7462,7464,7467,7469,7471],{"class":1055,"line":2018},[1053,7456,7457],{"class":3330},"            200",[1053,7459,1658],{"class":1113},[1053,7461,5979],{"class":1538},[1053,7463,1463],{"class":1113},[1053,7465,7466],{"class":1544},"many",[1053,7468,1530],{"class":1113},[1053,7470,2180],{"class":1753},[1053,7472,7473],{"class":1113},"),\n",[1053,7475,7476,7479,7481,7484],{"class":1055,"line":2030},[1053,7477,7478],{"class":3330},"            400",[1053,7480,1658],{"class":1113},[1053,7482,7483],{"class":1538}," OpenApiExample",[1053,7485,1602],{"class":1113},[1053,7487,7488,7490,7493,7495],{"class":1055,"line":2059},[1053,7489,4373],{"class":1648},[1053,7491,7492],{"class":1652},"Bad Request",[1053,7494,1649],{"class":1648},[1053,7496,1636],{"class":1113},[1053,7498,7499,7502,7504,7506,7508,7510,7512,7514,7517,7519],{"class":1055,"line":2088},[1053,7500,7501],{"class":1544},"                value",[1053,7503,1645],{"class":1113},[1053,7505,1649],{"class":1648},[1053,7507,1877],{"class":1652},[1053,7509,1649],{"class":1648},[1053,7511,1658],{"class":1113},[1053,7513,1884],{"class":1648},[1053,7515,7516],{"class":1652},"Invalid parameters",[1053,7518,1649],{"class":1648},[1053,7520,7521],{"class":1113},"},\n",[1053,7523,7524,7527,7529],{"class":1055,"line":2093},[1053,7525,7526],{"class":1544},"                response_only",[1053,7528,1530],{"class":1113},[1053,7530,7531],{"class":1753},"True\n",[1053,7533,7534],{"class":1055,"line":2119},[1053,7535,1688],{"class":1113},[1053,7537,7538],{"class":1055,"line":2129},[1053,7539,7540],{"class":1113},"        },\n",[1053,7542,7543,7546,7549,7551,7554,7556],{"class":1055,"line":2144},[1053,7544,7545],{"class":1544},"        tags",[1053,7547,7548],{"class":1113},"=[",[1053,7550,1649],{"class":1648},[1053,7552,7553],{"class":1652},"Users",[1053,7555,1649],{"class":1648},[1053,7557,2661],{"class":1113},[1053,7559,7560],{"class":1055,"line":2185},[1053,7561,7562],{"class":1113},"    )\n",[1053,7564,7565,7567,7569,7571,7573,7575,7577],{"class":1055,"line":2198},[1053,7566,1493],{"class":1455},[1053,7568,4779],{"class":4076},[1053,7570,1463],{"class":1113},[1053,7572,1503],{"class":1502},[1053,7574,1506],{"class":1113},[1053,7576,1510],{"class":1509},[1053,7578,1470],{"class":1113},[1053,7580,7581,7583,7585,7587,7589,7591,7593],{"class":1055,"line":2209},[1053,7582,1694],{"class":1402},[1053,7584,4077],{"class":4076},[1053,7586,4080],{"class":1113},[1053,7588,6413],{"class":1538},[1053,7590,1463],{"class":1113},[1053,7592,1550],{"class":1538},[1053,7594,1558],{"class":1113},[1053,7596,7597],{"class":1055,"line":2238},[1053,7598,1488],{"class":1074},[1053,7600,7601,7603,7605],{"class":1055,"line":2267},[1053,7602,7121],{"class":1113},[1053,7604,7124],{"class":1496},[1053,7606,1602],{"class":1113},[1053,7608,7609,7611,7613,7615,7618,7620],{"class":1055,"line":2272},[1053,7610,7131],{"class":1544},[1053,7612,1530],{"class":1113},[1053,7614,5738],{"class":1648},[1053,7616,7617],{"class":1652},"Create user",[1053,7619,5738],{"class":1648},[1053,7621,1636],{"class":1113},[1053,7623,7624,7626,7628,7630,7633,7635],{"class":1055,"line":2298},[1053,7625,7147],{"class":1544},[1053,7627,1530],{"class":1113},[1053,7629,5738],{"class":1648},[1053,7631,7632],{"class":1652},"Create a new user account",[1053,7634,5738],{"class":1648},[1053,7636,1636],{"class":1113},[1053,7638,7639,7642,7644,7646],{"class":1055,"line":2308},[1053,7640,7641],{"class":1544},"        request",[1053,7643,1530],{"class":1113},[1053,7645,6160],{"class":1538},[1053,7647,1636],{"class":1113},[1053,7649,7650,7652],{"class":1055,"line":2323},[1053,7651,7449],{"class":1544},[1053,7653,7452],{"class":1113},[1053,7655,7656,7659,7661,7663],{"class":1055,"line":2336},[1053,7657,7658],{"class":3330},"            201",[1053,7660,1658],{"class":1113},[1053,7662,5525],{"class":1538},[1053,7664,1636],{"class":1113},[1053,7666,7667,7669,7671,7673],{"class":1055,"line":3912},[1053,7668,7478],{"class":3330},[1053,7670,1658],{"class":1113},[1053,7672,7483],{"class":1538},[1053,7674,1602],{"class":1113},[1053,7676,7677,7679,7682,7684],{"class":1055,"line":3925},[1053,7678,4373],{"class":1648},[1053,7680,7681],{"class":1652},"Validation Error",[1053,7683,1649],{"class":1648},[1053,7685,1636],{"class":1113},[1053,7687,7688,7690],{"class":1055,"line":3935},[1053,7689,7501],{"class":1544},[1053,7691,7452],{"class":1113},[1053,7693,7694,7697,7699,7701,7703,7705,7707,7710,7712],{"class":1055,"line":3941},[1053,7695,7696],{"class":1648},"                    '",[1053,7698,3201],{"class":1652},[1053,7700,1649],{"class":1648},[1053,7702,1658],{"class":1113},[1053,7704,2740],{"class":1113},[1053,7706,1649],{"class":1648},[1053,7708,7709],{"class":1652},"This field is required.",[1053,7711,1649],{"class":1648},[1053,7713,2758],{"class":1113},[1053,7715,7716,7718,7720,7722,7724,7726,7728,7731,7733],{"class":1055,"line":3952},[1053,7717,7696],{"class":1648},[1053,7719,3210],{"class":1652},[1053,7721,1649],{"class":1648},[1053,7723,1658],{"class":1113},[1053,7725,2740],{"class":1113},[1053,7727,1649],{"class":1648},[1053,7729,7730],{"class":1652},"Enter a valid email address.",[1053,7732,1649],{"class":1648},[1053,7734,2661],{"class":1113},[1053,7736,7737],{"class":1055,"line":3996},[1053,7738,7739],{"class":1113},"                },\n",[1053,7741,7742,7744,7746],{"class":1055,"line":4030},[1053,7743,7526],{"class":1544},[1053,7745,1530],{"class":1113},[1053,7747,7531],{"class":1753},[1053,7749,7750],{"class":1055,"line":4049},[1053,7751,1688],{"class":1113},[1053,7753,7754],{"class":1055,"line":4054},[1053,7755,7540],{"class":1113},[1053,7757,7758,7761],{"class":1055,"line":4068},[1053,7759,7760],{"class":1544},"        examples",[1053,7762,7166],{"class":1113},[1053,7764,7765,7768],{"class":1055,"line":4088},[1053,7766,7767],{"class":1538},"            OpenApiExample",[1053,7769,1602],{"class":1113},[1053,7771,7772,7774,7777,7779],{"class":1055,"line":4094},[1053,7773,4373],{"class":1648},[1053,7775,7776],{"class":1652},"User Creation",[1053,7778,1649],{"class":1648},[1053,7780,1636],{"class":1113},[1053,7782,7783,7785],{"class":1055,"line":4100},[1053,7784,7501],{"class":1544},[1053,7786,7452],{"class":1113},[1053,7788,7789,7791,7793,7795,7797,7799,7802,7804],{"class":1055,"line":4135},[1053,7790,7696],{"class":1648},[1053,7792,3201],{"class":1652},[1053,7794,1649],{"class":1648},[1053,7796,1658],{"class":1113},[1053,7798,1884],{"class":1648},[1053,7800,7801],{"class":1652},"johndoe",[1053,7803,1649],{"class":1648},[1053,7805,1636],{"class":1113},[1053,7807,7808,7810,7812,7814,7816,7818,7821,7823],{"class":1055,"line":4145},[1053,7809,7696],{"class":1648},[1053,7811,3210],{"class":1652},[1053,7813,1649],{"class":1648},[1053,7815,1658],{"class":1113},[1053,7817,1884],{"class":1648},[1053,7819,7820],{"class":1652},"john@example.com",[1053,7822,1649],{"class":1648},[1053,7824,1636],{"class":1113},[1053,7826,7827,7829,7831,7833,7835,7837,7840,7842],{"class":1055,"line":4161},[1053,7828,7696],{"class":1648},[1053,7830,3980],{"class":1652},[1053,7832,1649],{"class":1648},[1053,7834,1658],{"class":1113},[1053,7836,1884],{"class":1648},[1053,7838,7839],{"class":1652},"John",[1053,7841,1649],{"class":1648},[1053,7843,1636],{"class":1113},[1053,7845,7846,7848,7850,7852,7854,7856,7859,7861],{"class":1055,"line":4172},[1053,7847,7696],{"class":1648},[1053,7849,3989],{"class":1652},[1053,7851,1649],{"class":1648},[1053,7853,1658],{"class":1113},[1053,7855,1884],{"class":1648},[1053,7857,7858],{"class":1652},"Doe",[1053,7860,1649],{"class":1648},[1053,7862,1636],{"class":1113},[1053,7864,7865,7867,7870,7872,7874,7876,7879],{"class":1055,"line":4183},[1053,7866,7696],{"class":1648},[1053,7868,7869],{"class":1652},"password",[1053,7871,1649],{"class":1648},[1053,7873,1658],{"class":1113},[1053,7875,1884],{"class":1648},[1053,7877,7878],{"class":1652},"securepassword123",[1053,7880,4314],{"class":1648},[1053,7882,7883],{"class":1055,"line":4188},[1053,7884,7739],{"class":1113},[1053,7886,7887,7890,7892],{"class":1055,"line":4196},[1053,7888,7889],{"class":1544},"                request_only",[1053,7891,1530],{"class":1113},[1053,7893,7531],{"class":1753},[1053,7895,7896],{"class":1055,"line":4201},[1053,7897,1688],{"class":1113},[1053,7899,7900],{"class":1055,"line":4207},[1053,7901,7444],{"class":1113},[1053,7903,7904,7906,7908,7910,7912,7914],{"class":1055,"line":4213},[1053,7905,7545],{"class":1544},[1053,7907,7548],{"class":1113},[1053,7909,1649],{"class":1648},[1053,7911,7553],{"class":1652},[1053,7913,1649],{"class":1648},[1053,7915,2661],{"class":1113},[1053,7917,7918],{"class":1055,"line":4219},[1053,7919,7562],{"class":1113},[1053,7921,7922,7924,7926,7928,7930,7932,7934],{"class":1055,"line":6240},[1053,7923,1493],{"class":1455},[1053,7925,1497],{"class":1496},[1053,7927,1463],{"class":1113},[1053,7929,1503],{"class":1502},[1053,7931,1506],{"class":1113},[1053,7933,1510],{"class":1509},[1053,7935,1470],{"class":1113},[1053,7937,7938,7940,7942,7944,7947,7949,7951],{"class":1055,"line":6245},[1053,7939,1694],{"class":1402},[1053,7941,4077],{"class":4076},[1053,7943,4080],{"class":1113},[1053,7945,7946],{"class":1538},"create",[1053,7948,1463],{"class":1113},[1053,7950,1550],{"class":1538},[1053,7952,1558],{"class":1113},[1053,7954,7955],{"class":1055,"line":6263},[1053,7956,1220],{"emptyLinePlaceholder":1219},[1053,7958,7959],{"class":1055,"line":6298},[1053,7960,2675],{"class":1059},[1053,7962,7963,7966,7968],{"class":1055,"line":6337},[1053,7964,7965],{"class":1066},"INSTALLED_APPS",[1053,7967,2683],{"class":1113},[1053,7969,2598],{"class":1113},[1053,7971,7972],{"class":1055,"line":6342},[1053,7973,7974],{"class":1059},"    # ...\n",[1053,7976,7977,7979,7982,7984],{"class":1055,"line":6347},[1053,7978,2691],{"class":1648},[1053,7980,7981],{"class":1652},"drf_spectacular",[1053,7983,1649],{"class":1648},[1053,7985,1636],{"class":1113},[1053,7987,7988],{"class":1055,"line":6360},[1053,7989,2661],{"class":1113},[1053,7991,7992],{"class":1055,"line":6379},[1053,7993,1220],{"emptyLinePlaceholder":1219},[1053,7995,7996,7998,8000],{"class":1055,"line":6384},[1053,7997,2680],{"class":1066},[1053,7999,2683],{"class":1113},[1053,8001,2686],{"class":1113},[1053,8003,8004,8006,8009,8011,8013,8015,8018,8020],{"class":1055,"line":6397},[1053,8005,2691],{"class":1648},[1053,8007,8008],{"class":1652},"DEFAULT_SCHEMA_CLASS",[1053,8010,1649],{"class":1648},[1053,8012,1658],{"class":1113},[1053,8014,1884],{"class":1648},[1053,8016,8017],{"class":1652},"drf_spectacular.openapi.AutoSchema",[1053,8019,1649],{"class":1648},[1053,8021,1636],{"class":1113},[1053,8023,8024],{"class":1055,"line":6420},[1053,8025,1682],{"class":1113},[1053,8027,8028],{"class":1055,"line":6428},[1053,8029,1220],{"emptyLinePlaceholder":1219},[1053,8031,8032,8035,8037],{"class":1055,"line":6451},[1053,8033,8034],{"class":1066},"SPECTACULAR_SETTINGS",[1053,8036,2683],{"class":1113},[1053,8038,2686],{"class":1113},[1053,8040,8041,8043,8046,8048,8050,8052,8055,8057],{"class":1055,"line":6459},[1053,8042,2691],{"class":1648},[1053,8044,8045],{"class":1652},"TITLE",[1053,8047,1649],{"class":1648},[1053,8049,1658],{"class":1113},[1053,8051,1884],{"class":1648},[1053,8053,8054],{"class":1652},"Microservices API",[1053,8056,1649],{"class":1648},[1053,8058,1636],{"class":1113},[1053,8060,8061,8063,8066,8068,8070,8072,8075,8077],{"class":1055,"line":6466},[1053,8062,2691],{"class":1648},[1053,8064,8065],{"class":1652},"DESCRIPTION",[1053,8067,1649],{"class":1648},[1053,8069,1658],{"class":1113},[1053,8071,1884],{"class":1648},[1053,8073,8074],{"class":1652},"RESTful APIs for Django Microservices",[1053,8076,1649],{"class":1648},[1053,8078,1636],{"class":1113},[1053,8080,8081,8083,8086,8088,8090,8092,8095,8097],{"class":1055,"line":6471},[1053,8082,2691],{"class":1648},[1053,8084,8085],{"class":1652},"VERSION",[1053,8087,1649],{"class":1648},[1053,8089,1658],{"class":1113},[1053,8091,1884],{"class":1648},[1053,8093,8094],{"class":1652},"1.0.0",[1053,8096,1649],{"class":1648},[1053,8098,1636],{"class":1113},[1053,8100,8101,8103,8106,8108,8110,8113],{"class":1055,"line":6484},[1053,8102,2691],{"class":1648},[1053,8104,8105],{"class":1652},"SERVE_INCLUDE_SCHEMA",[1053,8107,1649],{"class":1648},[1053,8109,1658],{"class":1113},[1053,8111,8112],{"class":1753}," False",[1053,8114,1636],{"class":1113},[1053,8116,8117,8119,8122,8124,8126,8129],{"class":1055,"line":6499},[1053,8118,2691],{"class":1648},[1053,8120,8121],{"class":1652},"COMPONENT_SPLIT_REQUEST",[1053,8123,1649],{"class":1648},[1053,8125,1658],{"class":1113},[1053,8127,8128],{"class":1753}," True",[1053,8130,1636],{"class":1113},[1053,8132,8133,8135,8138,8140,8142,8144,8147,8149],{"class":1055,"line":6504},[1053,8134,2691],{"class":1648},[1053,8136,8137],{"class":1652},"SCHEMA_PATH_PREFIX",[1053,8139,1649],{"class":1648},[1053,8141,1658],{"class":1113},[1053,8143,1884],{"class":1648},[1053,8145,8146],{"class":1652},"/api/v[0-9]",[1053,8148,1649],{"class":1648},[1053,8150,1636],{"class":1113},[1053,8152,8153],{"class":1055,"line":6510},[1053,8154,1682],{"class":1113},[1053,8156,8157],{"class":1055,"line":6531},[1053,8158,1220],{"emptyLinePlaceholder":1219},[1053,8160,8161],{"class":1055,"line":6537},[1053,8162,8163],{"class":1059},"# urls.py\n",[1053,8165,8166,8168,8170,8172,8175,8177,8180,8182],{"class":1055,"line":6553},[1053,8167,1403],{"class":1402},[1053,8169,7050],{"class":1074},[1053,8171,1422],{"class":1113},[1053,8173,8174],{"class":1074},"views ",[1053,8176,1409],{"class":1402},[1053,8178,8179],{"class":1074}," SpectacularAPIView",[1053,8181,1506],{"class":1113},[1053,8183,8184],{"class":1074}," SpectacularSwaggerView\n",[1053,8186,8187],{"class":1055,"line":6596},[1053,8188,1220],{"emptyLinePlaceholder":1219},[1053,8190,8191,8193,8195],{"class":1055,"line":6613},[1053,8192,2593],{"class":1074},[1053,8194,1530],{"class":1113},[1053,8196,2598],{"class":1113},[1053,8198,8199,8201,8203,8205,8208,8210,8212,8214,8216,8219,8222,8224,8226,8228,8231,8233],{"class":1055,"line":6618},[1053,8200,2603],{"class":1538},[1053,8202,1463],{"class":1113},[1053,8204,1649],{"class":1648},[1053,8206,8207],{"class":1652},"api/schema/",[1053,8209,1649],{"class":1648},[1053,8211,1506],{"class":1113},[1053,8213,8179],{"class":1538},[1053,8215,1422],{"class":1113},[1053,8217,8218],{"class":1538},"as_view",[1053,8220,8221],{"class":1113},"(),",[1053,8223,3266],{"class":1544},[1053,8225,1530],{"class":1113},[1053,8227,1649],{"class":1648},[1053,8229,8230],{"class":1652},"schema",[1053,8232,1649],{"class":1648},[1053,8234,7473],{"class":1113},[1053,8236,8237,8239,8241,8243,8246,8248,8250,8253,8255,8257,8259,8262,8264,8266,8268,8270,8273,8275,8277,8279,8282,8284],{"class":1055,"line":6624},[1053,8238,2603],{"class":1538},[1053,8240,1463],{"class":1113},[1053,8242,1649],{"class":1648},[1053,8244,8245],{"class":1652},"api/docs/",[1053,8247,1649],{"class":1648},[1053,8249,1506],{"class":1113},[1053,8251,8252],{"class":1538}," SpectacularSwaggerView",[1053,8254,1422],{"class":1113},[1053,8256,8218],{"class":1538},[1053,8258,1463],{"class":1113},[1053,8260,8261],{"class":1544},"url_name",[1053,8263,1530],{"class":1113},[1053,8265,1649],{"class":1648},[1053,8267,8230],{"class":1652},[1053,8269,1649],{"class":1648},[1053,8271,8272],{"class":1113},"),",[1053,8274,3266],{"class":1544},[1053,8276,1530],{"class":1113},[1053,8278,1649],{"class":1648},[1053,8280,8281],{"class":1652},"swagger-ui",[1053,8283,1649],{"class":1648},[1053,8285,7473],{"class":1113},[1053,8287,8288],{"class":1055,"line":6640},[1053,8289,2661],{"class":1113},[1030,8291,8293],{"id":8292},"inter-service-communication","Inter-Service Communication",[1035,8295,8297],{"id":8296},"_1-service-client","1. Service Client",[1043,8299,8301],{"className":1045,"code":8300,"language":1047,"meta":1048,"style":1048},"# service_client.py\nimport requests\nimport logging\nfrom django.conf import settings\nfrom django.core.cache import cache\nfrom typing import Optional, Dict, Any\nimport json\n\nlogger = logging.getLogger(__name__)\n\nclass ServiceClient:\n    \"\"\"HTTP client for inter-service communication\"\"\"\n    \n    def __init__(self, service_name: str, base_url: str = None):\n        self.service_name = service_name\n        self.base_url = base_url or self._discover_service(service_name)\n        self.session = requests.Session()\n        self.session.headers.update({\n            'Content-Type': 'application/json',\n            'X-Service-Token': settings.SERVICE_SECRET_TOKEN,\n            'User-Agent': f'{settings.SERVICE_NAME}/1.0'\n        })\n    \n    def _discover_service(self, service_name: str) -> str:\n        \"\"\"Discover service URL from service registry\"\"\"\n        # Try cache first\n        cache_key = f\"service_url:{service_name}\"\n        url = cache.get(cache_key)\n        \n        if not url:\n            # Discover from Consul or other service registry\n            from .service_discovery import ConsulServiceDiscovery\n            discovery = ConsulServiceDiscovery()\n            url = discovery.discover_service(service_name)\n            \n            if url:\n                cache.set(cache_key, url, timeout=300)  # Cache for 5 minutes\n        \n        return url or f\"http://{service_name}:8000\"\n    \n    def get(self, endpoint: str, params: Dict = None, timeout: int = 30) -> Optional[Dict]:\n        \"\"\"GET request to service\"\"\"\n        return self._request('GET', endpoint, params=params, timeout=timeout)\n    \n    def post(self, endpoint: str, data: Dict = None, timeout: int = 30) -> Optional[Dict]:\n        \"\"\"POST request to service\"\"\"\n        return self._request('POST', endpoint, json=data, timeout=timeout)\n    \n    def put(self, endpoint: str, data: Dict = None, timeout: int = 30) -> Optional[Dict]:\n        \"\"\"PUT request to service\"\"\"\n        return self._request('PUT', endpoint, json=data, timeout=timeout)\n    \n    def delete(self, endpoint: str, timeout: int = 30) -> bool:\n        \"\"\"DELETE request to service\"\"\"\n        response = self._request('DELETE', endpoint, timeout=timeout)\n        return response is not None\n    \n    def _request(self, method: str, endpoint: str, **kwargs) -> Optional[Dict]:\n        \"\"\"Make HTTP request with error handling\"\"\"\n        url = f\"{self.base_url.rstrip('/')}/{endpoint.lstrip('/')}\"\n        \n        try:\n            response = self.session.request(method, url, **kwargs)\n            response.raise_for_status()\n            \n            if response.status_code == 204:  # No Content\n                return {}\n            \n            return response.json()\n            \n        except requests.exceptions.RequestException as e:\n            logger.error(f\"Service call failed: {method} {url} - {e}\")\n            return None\n        except json.JSONDecodeError as e:\n            logger.error(f\"Invalid JSON response from {url}: {e}\")\n            return None\n\n# Usage in views\nclass OrderViewSet(ModelViewSet):\n    \n    def create(self, request):\n        \"\"\"Create order with user and product validation\"\"\"\n        user_id = request.data.get('user_id')\n        product_ids = request.data.get('product_ids', [])\n        \n        # Validate user exists\n        user_client = ServiceClient('user-service')\n        user_data = user_client.get(f'api/v1/users/{user_id}/')\n        if not user_data:\n            return Response(\n                {'error': 'User not found'}, \n                status=status.HTTP_400_BAD_REQUEST\n            )\n        \n        # Validate products exist and get pricing\n        product_client = ServiceClient('product-service')\n        products_data = []\n        total_amount = 0\n        \n        for product_id in product_ids:\n            product_data = product_client.get(f'api/v1/products/{product_id}/')\n            if not product_data:\n                return Response(\n                    {'error': f'Product {product_id} not found'}, \n                    status=status.HTTP_400_BAD_REQUEST\n                )\n            products_data.append(product_data)\n            total_amount += float(product_data['price'])\n        \n        # Create order\n        order_data = {\n            'user_id': user_id,\n            'user_email': user_data['email'],\n            'products': products_data,\n            'total_amount': total_amount,\n            'status': 'pending'\n        }\n        \n        serializer = self.get_serializer(data=order_data)\n        if serializer.is_valid():\n            order = serializer.save()\n            \n            # Notify other services\n            self._notify_order_created(order, user_data, products_data)\n            \n            return Response(serializer.data, status=status.HTTP_201_CREATED)\n        \n        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)\n    \n    def _notify_order_created(self, order, user_data, products_data):\n        \"\"\"Notify other services about order creation\"\"\"\n        # Update inventory\n        product_client = ServiceClient('product-service')\n        for product in products_data:\n            product_client.post(f'api/v1/products/{product[\"id\"]}/reserve/', {\n                'quantity': 1,\n                'order_id': order.id\n            })\n        \n        # Send notification\n        notification_client = ServiceClient('notification-service')\n        notification_client.post('api/v1/notifications/', {\n            'user_id': user_data['id'],\n            'type': 'order_created',\n            'message': f'Your order #{order.id} has been created',\n            'metadata': {'order_id': order.id}\n        })\n",[1050,8302,8303,8308,8315,8322,8338,8359,8381,8388,8392,8415,8419,8428,8437,8441,8476,8491,8521,8542,8562,8582,8603,8633,8637,8641,8670,8679,8684,8705,8726,8730,8741,8746,8761,8773,8794,8798,8807,8840,8844,8867,8871,8933,8942,8985,8989,9044,9053,9094,9098,9153,9162,9202,9206,9246,9255,9290,9303,9307,9353,9362,9423,9427,9433,9465,9476,9480,9502,9510,9514,9527,9531,9555,9599,9605,9622,9656,9662,9666,9670,9683,9687,9703,9712,9740,9771,9775,9780,9800,9831,9842,9850,9872,9885,9889,9893,9898,9918,9928,9938,9942,9957,9989,10000,10008,10039,10052,10057,10074,10099,10103,10108,10117,10132,10155,10170,10186,10203,10208,10212,10235,10247,10262,10266,10271,10296,10300,10328,10332,10360,10364,10390,10399,10404,10423,10437,10478,10495,10514,10520,10525,10531,10552,10575,10598,10619,10651,10680],{"__ignoreMap":1048},[1053,8304,8305],{"class":1055,"line":1056},[1053,8306,8307],{"class":1059},"# service_client.py\n",[1053,8309,8310,8312],{"class":1055,"line":1063},[1053,8311,1409],{"class":1402},[1053,8313,8314],{"class":1074}," requests\n",[1053,8316,8317,8319],{"class":1055,"line":1094},[1053,8318,1409],{"class":1402},[1053,8320,8321],{"class":1074}," logging\n",[1053,8323,8324,8326,8328,8330,8333,8335],{"class":1055,"line":1129},[1053,8325,1403],{"class":1402},[1053,8327,2376],{"class":1074},[1053,8329,1422],{"class":1113},[1053,8331,8332],{"class":1074},"conf ",[1053,8334,1409],{"class":1402},[1053,8336,8337],{"class":1074}," settings\n",[1053,8339,8340,8342,8344,8346,8349,8351,8354,8356],{"class":1055,"line":1153},[1053,8341,1403],{"class":1402},[1053,8343,2376],{"class":1074},[1053,8345,1422],{"class":1113},[1053,8347,8348],{"class":1074},"core",[1053,8350,1422],{"class":1113},[1053,8352,8353],{"class":1074},"cache ",[1053,8355,1409],{"class":1402},[1053,8357,8358],{"class":1074}," cache\n",[1053,8360,8361,8363,8366,8368,8371,8373,8376,8378],{"class":1055,"line":1184},[1053,8362,1403],{"class":1402},[1053,8364,8365],{"class":1074}," typing ",[1053,8367,1409],{"class":1402},[1053,8369,8370],{"class":1074}," Optional",[1053,8372,1506],{"class":1113},[1053,8374,8375],{"class":1074}," Dict",[1053,8377,1506],{"class":1113},[1053,8379,8380],{"class":1074}," Any\n",[1053,8382,8383,8385],{"class":1055,"line":1216},[1053,8384,1409],{"class":1402},[1053,8386,8387],{"class":1074}," json\n",[1053,8389,8390],{"class":1055,"line":1223},[1053,8391,1220],{"emptyLinePlaceholder":1219},[1053,8393,8394,8397,8399,8402,8404,8407,8409,8413],{"class":1055,"line":1229},[1053,8395,8396],{"class":1074},"logger ",[1053,8398,1530],{"class":1113},[1053,8400,8401],{"class":1074}," logging",[1053,8403,1422],{"class":1113},[1053,8405,8406],{"class":1538},"getLogger",[1053,8408,1463],{"class":1113},[1053,8410,8412],{"class":8411},"s131V","__name__",[1053,8414,1558],{"class":1113},[1053,8416,8417],{"class":1055,"line":1264},[1053,8418,1220],{"emptyLinePlaceholder":1219},[1053,8420,8421,8423,8426],{"class":1055,"line":1298},[1053,8422,1456],{"class":1455},[1053,8424,8425],{"class":1459}," ServiceClient",[1053,8427,1775],{"class":1113},[1053,8429,8430,8432,8435],{"class":1055,"line":1303},[1053,8431,1476],{"class":1475},[1053,8433,8434],{"class":1479},"HTTP client for inter-service communication",[1053,8436,1483],{"class":1475},[1053,8438,8439],{"class":1055,"line":1309},[1053,8440,1488],{"class":1074},[1053,8442,8443,8445,8447,8449,8451,8453,8456,8458,8461,8463,8466,8468,8470,8472,8474],{"class":1055,"line":1330},[1053,8444,1493],{"class":1455},[1053,8446,5243],{"class":1117},[1053,8448,1463],{"class":1113},[1053,8450,1503],{"class":1502},[1053,8452,1506],{"class":1113},[1053,8454,8455],{"class":1509}," service_name",[1053,8457,1658],{"class":1113},[1053,8459,8460],{"class":4076}," str",[1053,8462,1506],{"class":1113},[1053,8464,8465],{"class":1509}," base_url",[1053,8467,1658],{"class":1113},[1053,8469,8460],{"class":4076},[1053,8471,2683],{"class":1113},[1053,8473,4863],{"class":1753},[1053,8475,1470],{"class":1113},[1053,8477,8478,8481,8483,8486,8488],{"class":1055,"line":1358},[1053,8479,8480],{"class":1066},"        self",[1053,8482,1422],{"class":1113},[1053,8484,8485],{"class":1555},"service_name",[1053,8487,2683],{"class":1113},[1053,8489,8490],{"class":1074}," service_name\n",[1053,8492,8493,8495,8497,8500,8502,8505,8508,8510,8512,8515,8517,8519],{"class":1055,"line":1619},[1053,8494,8480],{"class":1066},[1053,8496,1422],{"class":1113},[1053,8498,8499],{"class":1555},"base_url",[1053,8501,2683],{"class":1113},[1053,8503,8504],{"class":1074}," base_url ",[1053,8506,8507],{"class":1070},"or",[1053,8509,1533],{"class":1066},[1053,8511,1422],{"class":1113},[1053,8513,8514],{"class":1538},"_discover_service",[1053,8516,1463],{"class":1113},[1053,8518,8485],{"class":1538},[1053,8520,1558],{"class":1113},[1053,8522,8523,8525,8527,8530,8532,8535,8537,8540],{"class":1055,"line":1639},[1053,8524,8480],{"class":1066},[1053,8526,1422],{"class":1113},[1053,8528,8529],{"class":1555},"session",[1053,8531,2683],{"class":1113},[1053,8533,8534],{"class":1074}," requests",[1053,8536,1422],{"class":1113},[1053,8538,8539],{"class":1538},"Session",[1053,8541,1591],{"class":1113},[1053,8543,8544,8546,8548,8550,8552,8555,8557,8560],{"class":1055,"line":1685},[1053,8545,8480],{"class":1066},[1053,8547,1422],{"class":1113},[1053,8549,8529],{"class":1555},[1053,8551,1422],{"class":1113},[1053,8553,8554],{"class":1555},"headers",[1053,8556,1422],{"class":1113},[1053,8558,8559],{"class":1538},"update",[1053,8561,4354],{"class":1113},[1053,8563,8564,8566,8569,8571,8573,8575,8578,8580],{"class":1055,"line":1691},[1053,8565,4359],{"class":1648},[1053,8567,8568],{"class":1652},"Content-Type",[1053,8570,1649],{"class":1648},[1053,8572,1658],{"class":1113},[1053,8574,1884],{"class":1648},[1053,8576,8577],{"class":1652},"application/json",[1053,8579,1649],{"class":1648},[1053,8581,1636],{"class":1113},[1053,8583,8584,8586,8589,8591,8593,8596,8598,8601],{"class":1055,"line":1725},[1053,8585,4359],{"class":1648},[1053,8587,8588],{"class":1652},"X-Service-Token",[1053,8590,1649],{"class":1648},[1053,8592,1658],{"class":1113},[1053,8594,8595],{"class":1538}," settings",[1053,8597,1422],{"class":1113},[1053,8599,8600],{"class":1632},"SERVICE_SECRET_TOKEN",[1053,8602,1636],{"class":1113},[1053,8604,8605,8607,8610,8612,8614,8616,8618,8620,8623,8625,8628,8630],{"class":1055,"line":1730},[1053,8606,4359],{"class":1648},[1053,8608,8609],{"class":1652},"User-Agent",[1053,8611,1649],{"class":1648},[1053,8613,1658],{"class":1113},[1053,8615,1661],{"class":1455},[1053,8617,1649],{"class":1652},[1053,8619,1114],{"class":1667},[1053,8621,8622],{"class":1538},"settings",[1053,8624,1422],{"class":1113},[1053,8626,8627],{"class":1632},"SERVICE_NAME",[1053,8629,1121],{"class":1667},[1053,8631,8632],{"class":1652},"/1.0'\n",[1053,8634,8635],{"class":1055,"line":1759},[1053,8636,4533],{"class":1113},[1053,8638,8639],{"class":1055,"line":1769},[1053,8640,1488],{"class":1074},[1053,8642,8643,8645,8648,8650,8652,8654,8656,8658,8660,8663,8666,8668],{"class":1055,"line":1778},[1053,8644,1493],{"class":1455},[1053,8646,8647],{"class":1496}," _discover_service",[1053,8649,1463],{"class":1113},[1053,8651,1503],{"class":1502},[1053,8653,1506],{"class":1113},[1053,8655,8455],{"class":1509},[1053,8657,1658],{"class":1113},[1053,8659,8460],{"class":4076},[1053,8661,8662],{"class":1113},")",[1053,8664,8665],{"class":1113}," ->",[1053,8667,8460],{"class":4076},[1053,8669,1775],{"class":1113},[1053,8671,8672,8674,8677],{"class":1055,"line":1794},[1053,8673,1517],{"class":1475},[1053,8675,8676],{"class":1479},"Discover service URL from service registry",[1053,8678,1483],{"class":1475},[1053,8680,8681],{"class":1055,"line":1814},[1053,8682,8683],{"class":1059},"        # Try cache first\n",[1053,8685,8686,8689,8691,8693,8696,8698,8700,8702],{"class":1055,"line":1844},[1053,8687,8688],{"class":1074},"        cache_key ",[1053,8690,1530],{"class":1113},[1053,8692,1661],{"class":1455},[1053,8694,8695],{"class":1652},"\"service_url:",[1053,8697,1114],{"class":1667},[1053,8699,8485],{"class":1074},[1053,8701,1121],{"class":1667},[1053,8703,8704],{"class":1652},"\"\n",[1053,8706,8707,8710,8712,8715,8717,8719,8721,8724],{"class":1055,"line":1860},[1053,8708,8709],{"class":1074},"        url ",[1053,8711,1530],{"class":1113},[1053,8713,8714],{"class":1074}," cache",[1053,8716,1422],{"class":1113},[1053,8718,4121],{"class":1538},[1053,8720,1463],{"class":1113},[1053,8722,8723],{"class":1538},"cache_key",[1053,8725,1558],{"class":1113},[1053,8727,8728],{"class":1055,"line":1869},[1053,8729,4091],{"class":1074},[1053,8731,8732,8734,8736,8739],{"class":1055,"line":1897},[1053,8733,1563],{"class":1402},[1053,8735,4860],{"class":1070},[1053,8737,8738],{"class":1074}," url",[1053,8740,1775],{"class":1113},[1053,8742,8743],{"class":1055,"line":1911},[1053,8744,8745],{"class":1059},"            # Discover from Consul or other service registry\n",[1053,8747,8748,8751,8753,8756,8758],{"class":1055,"line":1916},[1053,8749,8750],{"class":1402},"            from",[1053,8752,2414],{"class":1113},[1053,8754,8755],{"class":1074},"service_discovery ",[1053,8757,1409],{"class":1402},[1053,8759,8760],{"class":1074}," ConsulServiceDiscovery\n",[1053,8762,8763,8766,8768,8771],{"class":1055,"line":1921},[1053,8764,8765],{"class":1074},"            discovery ",[1053,8767,1530],{"class":1113},[1053,8769,8770],{"class":1538}," ConsulServiceDiscovery",[1053,8772,1591],{"class":1113},[1053,8774,8775,8778,8780,8783,8785,8788,8790,8792],{"class":1055,"line":1947},[1053,8776,8777],{"class":1074},"            url ",[1053,8779,1530],{"class":1113},[1053,8781,8782],{"class":1074}," discovery",[1053,8784,1422],{"class":1113},[1053,8786,8787],{"class":1538},"discover_service",[1053,8789,1463],{"class":1113},[1053,8791,8485],{"class":1538},[1053,8793,1558],{"class":1113},[1053,8795,8796],{"class":1055,"line":1957},[1053,8797,4921],{"class":1074},[1053,8799,8800,8803,8805],{"class":1055,"line":1973},[1053,8801,8802],{"class":1402},"            if",[1053,8804,8738],{"class":1074},[1053,8806,1775],{"class":1113},[1053,8808,8809,8812,8814,8817,8819,8821,8823,8825,8827,8830,8832,8835,8837],{"class":1055,"line":2005},[1053,8810,8811],{"class":1074},"                cache",[1053,8813,1422],{"class":1113},[1053,8815,8816],{"class":1538},"set",[1053,8818,1463],{"class":1113},[1053,8820,8723],{"class":1538},[1053,8822,1506],{"class":1113},[1053,8824,8738],{"class":1538},[1053,8826,1506],{"class":1113},[1053,8828,8829],{"class":1544}," timeout",[1053,8831,1530],{"class":1113},[1053,8833,8834],{"class":3330},"300",[1053,8836,8662],{"class":1113},[1053,8838,8839],{"class":1059},"  # Cache for 5 minutes\n",[1053,8841,8842],{"class":1055,"line":2018},[1053,8843,4091],{"class":1074},[1053,8845,8846,8848,8851,8853,8855,8858,8860,8862,8864],{"class":1055,"line":2030},[1053,8847,1694],{"class":1402},[1053,8849,8850],{"class":1074}," url ",[1053,8852,8507],{"class":1070},[1053,8854,1661],{"class":1455},[1053,8856,8857],{"class":1652},"\"http://",[1053,8859,1114],{"class":1667},[1053,8861,8485],{"class":1074},[1053,8863,1121],{"class":1667},[1053,8865,8866],{"class":1652},":8000\"\n",[1053,8868,8869],{"class":1055,"line":2059},[1053,8870,1488],{"class":1074},[1053,8872,8873,8875,8878,8880,8882,8884,8887,8889,8891,8893,8896,8898,8901,8903,8905,8907,8909,8911,8914,8916,8919,8921,8923,8925,8927,8930],{"class":1055,"line":2088},[1053,8874,1493],{"class":1455},[1053,8876,8877],{"class":1496}," get",[1053,8879,1463],{"class":1113},[1053,8881,1503],{"class":1502},[1053,8883,1506],{"class":1113},[1053,8885,8886],{"class":1509}," endpoint",[1053,8888,1658],{"class":1113},[1053,8890,8460],{"class":4076},[1053,8892,1506],{"class":1113},[1053,8894,8895],{"class":1509}," params",[1053,8897,1658],{"class":1113},[1053,8899,8900],{"class":1074}," Dict ",[1053,8902,1530],{"class":1113},[1053,8904,4863],{"class":1753},[1053,8906,1506],{"class":1113},[1053,8908,8829],{"class":1509},[1053,8910,1658],{"class":1113},[1053,8912,8913],{"class":4076}," int",[1053,8915,2683],{"class":1113},[1053,8917,8918],{"class":3330}," 30",[1053,8920,8662],{"class":1113},[1053,8922,8665],{"class":1113},[1053,8924,8370],{"class":1074},[1053,8926,4938],{"class":1113},[1053,8928,8929],{"class":1074},"Dict",[1053,8931,8932],{"class":1113},"]:\n",[1053,8934,8935,8937,8940],{"class":1055,"line":2093},[1053,8936,1517],{"class":1475},[1053,8938,8939],{"class":1479},"GET request to service",[1053,8941,1483],{"class":1475},[1053,8943,8944,8946,8948,8950,8953,8955,8957,8959,8961,8963,8965,8967,8969,8971,8974,8976,8978,8980,8983],{"class":1055,"line":2119},[1053,8945,1694],{"class":1402},[1053,8947,1533],{"class":1066},[1053,8949,1422],{"class":1113},[1053,8951,8952],{"class":1538},"_request",[1053,8954,1463],{"class":1113},[1053,8956,1649],{"class":1648},[1053,8958,1067],{"class":1652},[1053,8960,1649],{"class":1648},[1053,8962,1506],{"class":1113},[1053,8964,8886],{"class":1538},[1053,8966,1506],{"class":1113},[1053,8968,8895],{"class":1544},[1053,8970,1530],{"class":1113},[1053,8972,8973],{"class":1538},"params",[1053,8975,1506],{"class":1113},[1053,8977,8829],{"class":1544},[1053,8979,1530],{"class":1113},[1053,8981,8982],{"class":1538},"timeout",[1053,8984,1558],{"class":1113},[1053,8986,8987],{"class":1055,"line":2129},[1053,8988,1488],{"class":1074},[1053,8990,8991,8993,8996,8998,9000,9002,9004,9006,9008,9010,9012,9014,9016,9018,9020,9022,9024,9026,9028,9030,9032,9034,9036,9038,9040,9042],{"class":1055,"line":2144},[1053,8992,1493],{"class":1455},[1053,8994,8995],{"class":1496}," post",[1053,8997,1463],{"class":1113},[1053,8999,1503],{"class":1502},[1053,9001,1506],{"class":1113},[1053,9003,8886],{"class":1509},[1053,9005,1658],{"class":1113},[1053,9007,8460],{"class":4076},[1053,9009,1506],{"class":1113},[1053,9011,1992],{"class":1509},[1053,9013,1658],{"class":1113},[1053,9015,8900],{"class":1074},[1053,9017,1530],{"class":1113},[1053,9019,4863],{"class":1753},[1053,9021,1506],{"class":1113},[1053,9023,8829],{"class":1509},[1053,9025,1658],{"class":1113},[1053,9027,8913],{"class":4076},[1053,9029,2683],{"class":1113},[1053,9031,8918],{"class":3330},[1053,9033,8662],{"class":1113},[1053,9035,8665],{"class":1113},[1053,9037,8370],{"class":1074},[1053,9039,4938],{"class":1113},[1053,9041,8929],{"class":1074},[1053,9043,8932],{"class":1113},[1053,9045,9046,9048,9051],{"class":1055,"line":2185},[1053,9047,1517],{"class":1475},[1053,9049,9050],{"class":1479},"POST request to service",[1053,9052,1483],{"class":1475},[1053,9054,9055,9057,9059,9061,9063,9065,9067,9069,9071,9073,9075,9077,9080,9082,9084,9086,9088,9090,9092],{"class":1055,"line":2198},[1053,9056,1694],{"class":1402},[1053,9058,1533],{"class":1066},[1053,9060,1422],{"class":1113},[1053,9062,8952],{"class":1538},[1053,9064,1463],{"class":1113},[1053,9066,1649],{"class":1648},[1053,9068,1132],{"class":1652},[1053,9070,1649],{"class":1648},[1053,9072,1506],{"class":1113},[1053,9074,8886],{"class":1538},[1053,9076,1506],{"class":1113},[1053,9078,9079],{"class":1544}," json",[1053,9081,1530],{"class":1113},[1053,9083,1545],{"class":1538},[1053,9085,1506],{"class":1113},[1053,9087,8829],{"class":1544},[1053,9089,1530],{"class":1113},[1053,9091,8982],{"class":1538},[1053,9093,1558],{"class":1113},[1053,9095,9096],{"class":1055,"line":2209},[1053,9097,1488],{"class":1074},[1053,9099,9100,9102,9105,9107,9109,9111,9113,9115,9117,9119,9121,9123,9125,9127,9129,9131,9133,9135,9137,9139,9141,9143,9145,9147,9149,9151],{"class":1055,"line":2238},[1053,9101,1493],{"class":1455},[1053,9103,9104],{"class":1496}," put",[1053,9106,1463],{"class":1113},[1053,9108,1503],{"class":1502},[1053,9110,1506],{"class":1113},[1053,9112,8886],{"class":1509},[1053,9114,1658],{"class":1113},[1053,9116,8460],{"class":4076},[1053,9118,1506],{"class":1113},[1053,9120,1992],{"class":1509},[1053,9122,1658],{"class":1113},[1053,9124,8900],{"class":1074},[1053,9126,1530],{"class":1113},[1053,9128,4863],{"class":1753},[1053,9130,1506],{"class":1113},[1053,9132,8829],{"class":1509},[1053,9134,1658],{"class":1113},[1053,9136,8913],{"class":4076},[1053,9138,2683],{"class":1113},[1053,9140,8918],{"class":3330},[1053,9142,8662],{"class":1113},[1053,9144,8665],{"class":1113},[1053,9146,8370],{"class":1074},[1053,9148,4938],{"class":1113},[1053,9150,8929],{"class":1074},[1053,9152,8932],{"class":1113},[1053,9154,9155,9157,9160],{"class":1055,"line":2267},[1053,9156,1517],{"class":1475},[1053,9158,9159],{"class":1479},"PUT request to service",[1053,9161,1483],{"class":1475},[1053,9163,9164,9166,9168,9170,9172,9174,9176,9178,9180,9182,9184,9186,9188,9190,9192,9194,9196,9198,9200],{"class":1055,"line":2272},[1053,9165,1694],{"class":1402},[1053,9167,1533],{"class":1066},[1053,9169,1422],{"class":1113},[1053,9171,8952],{"class":1538},[1053,9173,1463],{"class":1113},[1053,9175,1649],{"class":1648},[1053,9177,1156],{"class":1652},[1053,9179,1649],{"class":1648},[1053,9181,1506],{"class":1113},[1053,9183,8886],{"class":1538},[1053,9185,1506],{"class":1113},[1053,9187,9079],{"class":1544},[1053,9189,1530],{"class":1113},[1053,9191,1545],{"class":1538},[1053,9193,1506],{"class":1113},[1053,9195,8829],{"class":1544},[1053,9197,1530],{"class":1113},[1053,9199,8982],{"class":1538},[1053,9201,1558],{"class":1113},[1053,9203,9204],{"class":1055,"line":2298},[1053,9205,1488],{"class":1074},[1053,9207,9208,9210,9213,9215,9217,9219,9221,9223,9225,9227,9229,9231,9233,9235,9237,9239,9241,9244],{"class":1055,"line":2308},[1053,9209,1493],{"class":1455},[1053,9211,9212],{"class":1496}," delete",[1053,9214,1463],{"class":1113},[1053,9216,1503],{"class":1502},[1053,9218,1506],{"class":1113},[1053,9220,8886],{"class":1509},[1053,9222,1658],{"class":1113},[1053,9224,8460],{"class":4076},[1053,9226,1506],{"class":1113},[1053,9228,8829],{"class":1509},[1053,9230,1658],{"class":1113},[1053,9232,8913],{"class":4076},[1053,9234,2683],{"class":1113},[1053,9236,8918],{"class":3330},[1053,9238,8662],{"class":1113},[1053,9240,8665],{"class":1113},[1053,9242,9243],{"class":4076}," bool",[1053,9245,1775],{"class":1113},[1053,9247,9248,9250,9253],{"class":1055,"line":2323},[1053,9249,1517],{"class":1475},[1053,9251,9252],{"class":1479},"DELETE request to service",[1053,9254,1483],{"class":1475},[1053,9256,9257,9260,9262,9264,9266,9268,9270,9272,9274,9276,9278,9280,9282,9284,9286,9288],{"class":1055,"line":2336},[1053,9258,9259],{"class":1074},"        response ",[1053,9261,1530],{"class":1113},[1053,9263,1533],{"class":1066},[1053,9265,1422],{"class":1113},[1053,9267,8952],{"class":1538},[1053,9269,1463],{"class":1113},[1053,9271,1649],{"class":1648},[1053,9273,1187],{"class":1652},[1053,9275,1649],{"class":1648},[1053,9277,1506],{"class":1113},[1053,9279,8886],{"class":1538},[1053,9281,1506],{"class":1113},[1053,9283,8829],{"class":1544},[1053,9285,1530],{"class":1113},[1053,9287,8982],{"class":1538},[1053,9289,1558],{"class":1113},[1053,9291,9292,9294,9297,9299,9301],{"class":1055,"line":3912},[1053,9293,1694],{"class":1402},[1053,9295,9296],{"class":1074}," response ",[1053,9298,4857],{"class":1070},[1053,9300,4860],{"class":1070},[1053,9302,5968],{"class":1753},[1053,9304,9305],{"class":1055,"line":3925},[1053,9306,1488],{"class":1074},[1053,9308,9309,9311,9314,9316,9318,9320,9323,9325,9327,9329,9331,9333,9335,9337,9339,9341,9343,9345,9347,9349,9351],{"class":1055,"line":3935},[1053,9310,1493],{"class":1455},[1053,9312,9313],{"class":1496}," _request",[1053,9315,1463],{"class":1113},[1053,9317,1503],{"class":1502},[1053,9319,1506],{"class":1113},[1053,9321,9322],{"class":1509}," method",[1053,9324,1658],{"class":1113},[1053,9326,8460],{"class":4076},[1053,9328,1506],{"class":1113},[1053,9330,8886],{"class":1509},[1053,9332,1658],{"class":1113},[1053,9334,8460],{"class":4076},[1053,9336,1506],{"class":1113},[1053,9338,5260],{"class":1070},[1053,9340,5263],{"class":1509},[1053,9342,8662],{"class":1113},[1053,9344,8665],{"class":1113},[1053,9346,8370],{"class":1074},[1053,9348,4938],{"class":1113},[1053,9350,8929],{"class":1074},[1053,9352,8932],{"class":1113},[1053,9354,9355,9357,9360],{"class":1055,"line":3941},[1053,9356,1517],{"class":1475},[1053,9358,9359],{"class":1479},"Make HTTP request with error handling",[1053,9361,1483],{"class":1475},[1053,9363,9364,9366,9368,9370,9372,9374,9376,9378,9380,9382,9385,9387,9389,9391,9393,9395,9397,9399,9401,9404,9406,9409,9411,9413,9415,9417,9419,9421],{"class":1055,"line":3952},[1053,9365,8709],{"class":1074},[1053,9367,1530],{"class":1113},[1053,9369,1661],{"class":1455},[1053,9371,5738],{"class":1652},[1053,9373,1114],{"class":1667},[1053,9375,1503],{"class":1066},[1053,9377,1422],{"class":1113},[1053,9379,8499],{"class":1555},[1053,9381,1422],{"class":1113},[1053,9383,9384],{"class":1538},"rstrip",[1053,9386,1463],{"class":1113},[1053,9388,1649],{"class":1648},[1053,9390,1078],{"class":1652},[1053,9392,1649],{"class":1648},[1053,9394,8662],{"class":1113},[1053,9396,1121],{"class":1667},[1053,9398,1078],{"class":1652},[1053,9400,1114],{"class":1667},[1053,9402,9403],{"class":1074},"endpoint",[1053,9405,1422],{"class":1113},[1053,9407,9408],{"class":1538},"lstrip",[1053,9410,1463],{"class":1113},[1053,9412,1649],{"class":1648},[1053,9414,1078],{"class":1652},[1053,9416,1649],{"class":1648},[1053,9418,8662],{"class":1113},[1053,9420,1121],{"class":1667},[1053,9422,8704],{"class":1652},[1053,9424,9425],{"class":1055,"line":3996},[1053,9426,4091],{"class":1074},[1053,9428,9429,9431],{"class":1055,"line":4030},[1053,9430,1772],{"class":1402},[1053,9432,1775],{"class":1113},[1053,9434,9435,9437,9439,9441,9443,9445,9447,9449,9451,9453,9455,9457,9459,9461,9463],{"class":1055,"line":4049},[1053,9436,4897],{"class":1074},[1053,9438,1530],{"class":1113},[1053,9440,1533],{"class":1066},[1053,9442,1422],{"class":1113},[1053,9444,8529],{"class":1555},[1053,9446,1422],{"class":1113},[1053,9448,1550],{"class":1538},[1053,9450,1463],{"class":1113},[1053,9452,3124],{"class":1538},[1053,9454,1506],{"class":1113},[1053,9456,8738],{"class":1538},[1053,9458,1506],{"class":1113},[1053,9460,5260],{"class":1070},[1053,9462,5263],{"class":1538},[1053,9464,1558],{"class":1113},[1053,9466,9467,9469,9471,9474],{"class":1055,"line":4054},[1053,9468,4931],{"class":1074},[1053,9470,1422],{"class":1113},[1053,9472,9473],{"class":1538},"raise_for_status",[1053,9475,1591],{"class":1113},[1053,9477,9478],{"class":1055,"line":4068},[1053,9479,4921],{"class":1074},[1053,9481,9482,9484,9487,9489,9492,9494,9497,9499],{"class":1055,"line":4088},[1053,9483,8802],{"class":1402},[1053,9485,9486],{"class":1074}," response",[1053,9488,1422],{"class":1113},[1053,9490,9491],{"class":1555},"status_code",[1053,9493,2833],{"class":1070},[1053,9495,9496],{"class":3330}," 204",[1053,9498,1658],{"class":1113},[1053,9500,9501],{"class":1059},"  # No Content\n",[1053,9503,9504,9507],{"class":1055,"line":4094},[1053,9505,9506],{"class":1402},"                return",[1053,9508,9509],{"class":1113}," {}\n",[1053,9511,9512],{"class":1055,"line":4100},[1053,9513,4921],{"class":1074},[1053,9515,9516,9518,9520,9522,9525],{"class":1055,"line":4135},[1053,9517,1596],{"class":1402},[1053,9519,9486],{"class":1074},[1053,9521,1422],{"class":1113},[1053,9523,9524],{"class":1538},"json",[1053,9526,1591],{"class":1113},[1053,9528,9529],{"class":1055,"line":4145},[1053,9530,4921],{"class":1074},[1053,9532,9533,9535,9537,9539,9542,9544,9547,9550,9553],{"class":1055,"line":4161},[1053,9534,1847],{"class":1402},[1053,9536,8534],{"class":1074},[1053,9538,1422],{"class":1113},[1053,9540,9541],{"class":1555},"exceptions",[1053,9543,1422],{"class":1113},[1053,9545,9546],{"class":1555},"RequestException",[1053,9548,9549],{"class":1402}," as",[1053,9551,9552],{"class":1074}," e",[1053,9554,1775],{"class":1113},[1053,9556,9557,9560,9562,9564,9566,9569,9572,9574,9576,9578,9580,9583,9585,9588,9590,9593,9595,9597],{"class":1055,"line":4172},[1053,9558,9559],{"class":1074},"            logger",[1053,9561,1422],{"class":1113},[1053,9563,1877],{"class":1538},[1053,9565,1463],{"class":1113},[1053,9567,9568],{"class":1455},"f",[1053,9570,9571],{"class":1652},"\"Service call failed: ",[1053,9573,1114],{"class":1667},[1053,9575,3124],{"class":1538},[1053,9577,1121],{"class":1667},[1053,9579,5752],{"class":1667},[1053,9581,9582],{"class":1538},"url",[1053,9584,1121],{"class":1667},[1053,9586,9587],{"class":1652}," - ",[1053,9589,1114],{"class":1667},[1053,9591,9592],{"class":1538},"e",[1053,9594,1121],{"class":1667},[1053,9596,5738],{"class":1652},[1053,9598,1558],{"class":1113},[1053,9600,9601,9603],{"class":1055,"line":4183},[1053,9602,1596],{"class":1402},[1053,9604,5968],{"class":1753},[1053,9606,9607,9609,9611,9613,9616,9618,9620],{"class":1055,"line":4188},[1053,9608,1847],{"class":1402},[1053,9610,9079],{"class":1074},[1053,9612,1422],{"class":1113},[1053,9614,9615],{"class":1555},"JSONDecodeError",[1053,9617,9549],{"class":1402},[1053,9619,9552],{"class":1074},[1053,9621,1775],{"class":1113},[1053,9623,9624,9626,9628,9630,9632,9634,9637,9639,9641,9643,9646,9648,9650,9652,9654],{"class":1055,"line":4196},[1053,9625,9559],{"class":1074},[1053,9627,1422],{"class":1113},[1053,9629,1877],{"class":1538},[1053,9631,1463],{"class":1113},[1053,9633,9568],{"class":1455},[1053,9635,9636],{"class":1652},"\"Invalid JSON response from ",[1053,9638,1114],{"class":1667},[1053,9640,9582],{"class":1538},[1053,9642,1121],{"class":1667},[1053,9644,9645],{"class":1652},": ",[1053,9647,1114],{"class":1667},[1053,9649,9592],{"class":1538},[1053,9651,1121],{"class":1667},[1053,9653,5738],{"class":1652},[1053,9655,1558],{"class":1113},[1053,9657,9658,9660],{"class":1055,"line":4201},[1053,9659,1596],{"class":1402},[1053,9661,5968],{"class":1753},[1053,9663,9664],{"class":1055,"line":4207},[1053,9665,1220],{"emptyLinePlaceholder":1219},[1053,9667,9668],{"class":1055,"line":4213},[1053,9669,2791],{"class":1059},[1053,9671,9672,9674,9677,9679,9681],{"class":1055,"line":4219},[1053,9673,1456],{"class":1455},[1053,9675,9676],{"class":1459}," OrderViewSet",[1053,9678,1463],{"class":1113},[1053,9680,1467],{"class":1466},[1053,9682,1470],{"class":1113},[1053,9684,9685],{"class":1055,"line":6240},[1053,9686,1488],{"class":1074},[1053,9688,9689,9691,9693,9695,9697,9699,9701],{"class":1055,"line":6245},[1053,9690,1493],{"class":1455},[1053,9692,1497],{"class":1496},[1053,9694,1463],{"class":1113},[1053,9696,1503],{"class":1502},[1053,9698,1506],{"class":1113},[1053,9700,1510],{"class":1509},[1053,9702,1470],{"class":1113},[1053,9704,9705,9707,9710],{"class":1055,"line":6263},[1053,9706,1517],{"class":1475},[1053,9708,9709],{"class":1479},"Create order with user and product validation",[1053,9711,1483],{"class":1475},[1053,9713,9714,9717,9719,9721,9723,9725,9727,9729,9731,9733,9736,9738],{"class":1055,"line":6298},[1053,9715,9716],{"class":1074},"        user_id ",[1053,9718,1530],{"class":1113},[1053,9720,1510],{"class":1074},[1053,9722,1422],{"class":1113},[1053,9724,1545],{"class":1555},[1053,9726,1422],{"class":1113},[1053,9728,4121],{"class":1538},[1053,9730,1463],{"class":1113},[1053,9732,1649],{"class":1648},[1053,9734,9735],{"class":1652},"user_id",[1053,9737,1649],{"class":1648},[1053,9739,1558],{"class":1113},[1053,9741,9742,9745,9747,9749,9751,9753,9755,9757,9759,9761,9764,9766,9768],{"class":1055,"line":6337},[1053,9743,9744],{"class":1074},"        product_ids ",[1053,9746,1530],{"class":1113},[1053,9748,1510],{"class":1074},[1053,9750,1422],{"class":1113},[1053,9752,1545],{"class":1555},[1053,9754,1422],{"class":1113},[1053,9756,4121],{"class":1538},[1053,9758,1463],{"class":1113},[1053,9760,1649],{"class":1648},[1053,9762,9763],{"class":1652},"product_ids",[1053,9765,1649],{"class":1648},[1053,9767,1506],{"class":1113},[1053,9769,9770],{"class":1113}," [])\n",[1053,9772,9773],{"class":1055,"line":6342},[1053,9774,4091],{"class":1074},[1053,9776,9777],{"class":1055,"line":6347},[1053,9778,9779],{"class":1059},"        # Validate user exists\n",[1053,9781,9782,9785,9787,9789,9791,9793,9796,9798],{"class":1055,"line":6360},[1053,9783,9784],{"class":1074},"        user_client ",[1053,9786,1530],{"class":1113},[1053,9788,8425],{"class":1538},[1053,9790,1463],{"class":1113},[1053,9792,1649],{"class":1648},[1053,9794,9795],{"class":1652},"user-service",[1053,9797,1649],{"class":1648},[1053,9799,1558],{"class":1113},[1053,9801,9802,9805,9807,9810,9812,9814,9816,9818,9821,9823,9825,9827,9829],{"class":1055,"line":6379},[1053,9803,9804],{"class":1074},"        user_data ",[1053,9806,1530],{"class":1113},[1053,9808,9809],{"class":1074}," user_client",[1053,9811,1422],{"class":1113},[1053,9813,4121],{"class":1538},[1053,9815,1463],{"class":1113},[1053,9817,9568],{"class":1455},[1053,9819,9820],{"class":1652},"'api/v1/users/",[1053,9822,1114],{"class":1667},[1053,9824,9735],{"class":1538},[1053,9826,1121],{"class":1667},[1053,9828,1679],{"class":1652},[1053,9830,1558],{"class":1113},[1053,9832,9833,9835,9837,9840],{"class":1055,"line":6384},[1053,9834,1563],{"class":1402},[1053,9836,4860],{"class":1070},[1053,9838,9839],{"class":1074}," user_data",[1053,9841,1775],{"class":1113},[1053,9843,9844,9846,9848],{"class":1055,"line":6397},[1053,9845,1596],{"class":1402},[1053,9847,1599],{"class":1538},[1053,9849,1602],{"class":1113},[1053,9851,9852,9854,9856,9858,9860,9862,9864,9866,9868,9870],{"class":1055,"line":6420},[1053,9853,1872],{"class":1113},[1053,9855,1649],{"class":1648},[1053,9857,1877],{"class":1652},[1053,9859,1649],{"class":1648},[1053,9861,1658],{"class":1113},[1053,9863,1884],{"class":1648},[1053,9865,1887],{"class":1652},[1053,9867,1649],{"class":1648},[1053,9869,1892],{"class":1113},[1053,9871,1616],{"class":1538},[1053,9873,9874,9876,9878,9880,9882],{"class":1055,"line":6428},[1053,9875,1622],{"class":1544},[1053,9877,1530],{"class":1113},[1053,9879,1627],{"class":1538},[1053,9881,1422],{"class":1113},[1053,9883,9884],{"class":1632},"HTTP_400_BAD_REQUEST\n",[1053,9886,9887],{"class":1055,"line":6451},[1053,9888,1688],{"class":1113},[1053,9890,9891],{"class":1055,"line":6459},[1053,9892,4091],{"class":1074},[1053,9894,9895],{"class":1055,"line":6466},[1053,9896,9897],{"class":1059},"        # Validate products exist and get pricing\n",[1053,9899,9900,9903,9905,9907,9909,9911,9914,9916],{"class":1055,"line":6471},[1053,9901,9902],{"class":1074},"        product_client ",[1053,9904,1530],{"class":1113},[1053,9906,8425],{"class":1538},[1053,9908,1463],{"class":1113},[1053,9910,1649],{"class":1648},[1053,9912,9913],{"class":1652},"product-service",[1053,9915,1649],{"class":1648},[1053,9917,1558],{"class":1113},[1053,9919,9920,9923,9925],{"class":1055,"line":6484},[1053,9921,9922],{"class":1074},"        products_data ",[1053,9924,1530],{"class":1113},[1053,9926,9927],{"class":1113}," []\n",[1053,9929,9930,9933,9935],{"class":1055,"line":6499},[1053,9931,9932],{"class":1074},"        total_amount ",[1053,9934,1530],{"class":1113},[1053,9936,9937],{"class":3330}," 0\n",[1053,9939,9940],{"class":1055,"line":6504},[1053,9941,4091],{"class":1074},[1053,9943,9944,9947,9950,9952,9955],{"class":1055,"line":6510},[1053,9945,9946],{"class":1402},"        for",[1053,9948,9949],{"class":1074}," product_id ",[1053,9951,5425],{"class":1402},[1053,9953,9954],{"class":1074}," product_ids",[1053,9956,1775],{"class":1113},[1053,9958,9959,9962,9964,9967,9969,9971,9973,9975,9978,9980,9983,9985,9987],{"class":1055,"line":6531},[1053,9960,9961],{"class":1074},"            product_data ",[1053,9963,1530],{"class":1113},[1053,9965,9966],{"class":1074}," product_client",[1053,9968,1422],{"class":1113},[1053,9970,4121],{"class":1538},[1053,9972,1463],{"class":1113},[1053,9974,9568],{"class":1455},[1053,9976,9977],{"class":1652},"'api/v1/products/",[1053,9979,1114],{"class":1667},[1053,9981,9982],{"class":1538},"product_id",[1053,9984,1121],{"class":1667},[1053,9986,1679],{"class":1652},[1053,9988,1558],{"class":1113},[1053,9990,9991,9993,9995,9998],{"class":1055,"line":6537},[1053,9992,8802],{"class":1402},[1053,9994,4860],{"class":1070},[1053,9996,9997],{"class":1074}," product_data",[1053,9999,1775],{"class":1113},[1053,10001,10002,10004,10006],{"class":1055,"line":6553},[1053,10003,9506],{"class":1402},[1053,10005,1599],{"class":1538},[1053,10007,1602],{"class":1113},[1053,10009,10010,10013,10015,10017,10019,10021,10023,10026,10028,10030,10032,10035,10037],{"class":1055,"line":6596},[1053,10011,10012],{"class":1113},"                    {",[1053,10014,1649],{"class":1648},[1053,10016,1877],{"class":1652},[1053,10018,1649],{"class":1648},[1053,10020,1658],{"class":1113},[1053,10022,1661],{"class":1455},[1053,10024,10025],{"class":1652},"'Product ",[1053,10027,1114],{"class":1667},[1053,10029,9982],{"class":1538},[1053,10031,1121],{"class":1667},[1053,10033,10034],{"class":1652}," not found'",[1053,10036,1892],{"class":1113},[1053,10038,1616],{"class":1538},[1053,10040,10041,10044,10046,10048,10050],{"class":1055,"line":6613},[1053,10042,10043],{"class":1544},"                    status",[1053,10045,1530],{"class":1113},[1053,10047,1627],{"class":1538},[1053,10049,1422],{"class":1113},[1053,10051,9884],{"class":1632},[1053,10053,10054],{"class":1055,"line":6618},[1053,10055,10056],{"class":1113},"                )\n",[1053,10058,10059,10062,10064,10067,10069,10072],{"class":1055,"line":6624},[1053,10060,10061],{"class":1074},"            products_data",[1053,10063,1422],{"class":1113},[1053,10065,10066],{"class":1538},"append",[1053,10068,1463],{"class":1113},[1053,10070,10071],{"class":1538},"product_data",[1053,10073,1558],{"class":1113},[1053,10075,10076,10079,10082,10085,10087,10089,10091,10093,10095,10097],{"class":1055,"line":6640},[1053,10077,10078],{"class":1074},"            total_amount ",[1053,10080,10081],{"class":1113},"+=",[1053,10083,10084],{"class":4076}," float",[1053,10086,1463],{"class":1113},[1053,10088,10071],{"class":1538},[1053,10090,4938],{"class":1113},[1053,10092,1649],{"class":1648},[1053,10094,3575],{"class":1652},[1053,10096,1649],{"class":1648},[1053,10098,6765],{"class":1113},[1053,10100,10101],{"class":1055,"line":6661},[1053,10102,4091],{"class":1074},[1053,10104,10105],{"class":1055,"line":6666},[1053,10106,10107],{"class":1059},"        # Create order\n",[1053,10109,10110,10113,10115],{"class":1055,"line":6687},[1053,10111,10112],{"class":1074},"        order_data ",[1053,10114,1530],{"class":1113},[1053,10116,2686],{"class":1113},[1053,10118,10119,10121,10123,10125,10127,10130],{"class":1055,"line":6693},[1053,10120,4359],{"class":1648},[1053,10122,9735],{"class":1652},[1053,10124,1649],{"class":1648},[1053,10126,1658],{"class":1113},[1053,10128,10129],{"class":1074}," user_id",[1053,10131,1636],{"class":1113},[1053,10133,10134,10136,10139,10141,10143,10145,10147,10149,10151,10153],{"class":1055,"line":6722},[1053,10135,4359],{"class":1648},[1053,10137,10138],{"class":1652},"user_email",[1053,10140,1649],{"class":1648},[1053,10142,1658],{"class":1113},[1053,10144,9839],{"class":1074},[1053,10146,4938],{"class":1113},[1053,10148,1649],{"class":1648},[1053,10150,3210],{"class":1652},[1053,10152,1649],{"class":1648},[1053,10154,2758],{"class":1113},[1053,10156,10157,10159,10161,10163,10165,10168],{"class":1055,"line":6768},[1053,10158,4359],{"class":1648},[1053,10160,2492],{"class":1652},[1053,10162,1649],{"class":1648},[1053,10164,1658],{"class":1113},[1053,10166,10167],{"class":1074}," products_data",[1053,10169,1636],{"class":1113},[1053,10171,10172,10174,10177,10179,10181,10184],{"class":1055,"line":6773},[1053,10173,4359],{"class":1648},[1053,10175,10176],{"class":1652},"total_amount",[1053,10178,1649],{"class":1648},[1053,10180,1658],{"class":1113},[1053,10182,10183],{"class":1074}," total_amount",[1053,10185,1636],{"class":1113},[1053,10187,10188,10190,10192,10194,10196,10198,10201],{"class":1055,"line":6778},[1053,10189,4359],{"class":1648},[1053,10191,1627],{"class":1652},[1053,10193,1649],{"class":1648},[1053,10195,1658],{"class":1113},[1053,10197,1884],{"class":1648},[1053,10199,10200],{"class":1652},"pending",[1053,10202,4314],{"class":1648},[1053,10204,10205],{"class":1055,"line":6785},[1053,10206,10207],{"class":1113},"        }\n",[1053,10209,10210],{"class":1055,"line":6790},[1053,10211,4091],{"class":1074},[1053,10213,10214,10216,10218,10220,10222,10224,10226,10228,10230,10233],{"class":1055,"line":6816},[1053,10215,1527],{"class":1074},[1053,10217,1530],{"class":1113},[1053,10219,1533],{"class":1066},[1053,10221,1422],{"class":1113},[1053,10223,1539],{"class":1538},[1053,10225,1463],{"class":1113},[1053,10227,1545],{"class":1544},[1053,10229,1530],{"class":1113},[1053,10231,10232],{"class":1538},"order_data",[1053,10234,1558],{"class":1113},[1053,10236,10237,10239,10241,10243,10245],{"class":1055,"line":6826},[1053,10238,1563],{"class":1402},[1053,10240,1566],{"class":1074},[1053,10242,1422],{"class":1113},[1053,10244,1571],{"class":1538},[1053,10246,1574],{"class":1113},[1053,10248,10249,10252,10254,10256,10258,10260],{"class":1055,"line":6857},[1053,10250,10251],{"class":1074},"            order ",[1053,10253,1530],{"class":1113},[1053,10255,1566],{"class":1074},[1053,10257,1422],{"class":1113},[1053,10259,1588],{"class":1538},[1053,10261,1591],{"class":1113},[1053,10263,10264],{"class":1055,"line":6867},[1053,10265,4921],{"class":1074},[1053,10267,10268],{"class":1055,"line":6902},[1053,10269,10270],{"class":1059},"            # Notify other services\n",[1053,10272,10273,10276,10278,10281,10283,10286,10288,10290,10292,10294],{"class":1055,"line":6907},[1053,10274,10275],{"class":1066},"            self",[1053,10277,1422],{"class":1113},[1053,10279,10280],{"class":1538},"_notify_order_created",[1053,10282,1463],{"class":1113},[1053,10284,10285],{"class":1538},"order",[1053,10287,1506],{"class":1113},[1053,10289,9839],{"class":1538},[1053,10291,1506],{"class":1113},[1053,10293,10167],{"class":1538},[1053,10295,1558],{"class":1113},[1053,10297,10298],{"class":1055,"line":6938},[1053,10299,4921],{"class":1074},[1053,10301,10302,10304,10306,10308,10310,10312,10314,10316,10318,10320,10322,10324,10326],{"class":1055,"line":6947},[1053,10303,1596],{"class":1402},[1053,10305,1599],{"class":1538},[1053,10307,1463],{"class":1113},[1053,10309,1701],{"class":1538},[1053,10311,1422],{"class":1113},[1053,10313,1545],{"class":1555},[1053,10315,1506],{"class":1113},[1053,10317,1711],{"class":1544},[1053,10319,1530],{"class":1113},[1053,10321,1627],{"class":1538},[1053,10323,1422],{"class":1113},[1053,10325,1633],{"class":1632},[1053,10327,1558],{"class":1113},[1053,10329,10330],{"class":1055,"line":6980},[1053,10331,4091],{"class":1074},[1053,10333,10334,10336,10338,10340,10342,10344,10346,10348,10350,10352,10354,10356,10358],{"class":1055,"line":6985},[1053,10335,1694],{"class":1402},[1053,10337,1599],{"class":1538},[1053,10339,1463],{"class":1113},[1053,10341,1701],{"class":1538},[1053,10343,1422],{"class":1113},[1053,10345,1706],{"class":1555},[1053,10347,1506],{"class":1113},[1053,10349,1711],{"class":1544},[1053,10351,1530],{"class":1113},[1053,10353,1627],{"class":1538},[1053,10355,1422],{"class":1113},[1053,10357,1720],{"class":1632},[1053,10359,1558],{"class":1113},[1053,10361,10362],{"class":1055,"line":7010},[1053,10363,1488],{"class":1074},[1053,10365,10366,10368,10371,10373,10375,10377,10380,10382,10384,10386,10388],{"class":1055,"line":7015},[1053,10367,1493],{"class":1455},[1053,10369,10370],{"class":1496}," _notify_order_created",[1053,10372,1463],{"class":1113},[1053,10374,1503],{"class":1502},[1053,10376,1506],{"class":1113},[1053,10378,10379],{"class":1509}," order",[1053,10381,1506],{"class":1113},[1053,10383,9839],{"class":1509},[1053,10385,1506],{"class":1113},[1053,10387,10167],{"class":1509},[1053,10389,1470],{"class":1113},[1053,10391,10392,10394,10397],{"class":1055,"line":7020},[1053,10393,1517],{"class":1475},[1053,10395,10396],{"class":1479},"Notify other services about order creation",[1053,10398,1483],{"class":1475},[1053,10400,10401],{"class":1055,"line":7026},[1053,10402,10403],{"class":1059},"        # Update inventory\n",[1053,10405,10407,10409,10411,10413,10415,10417,10419,10421],{"class":1055,"line":10406},133,[1053,10408,9902],{"class":1074},[1053,10410,1530],{"class":1113},[1053,10412,8425],{"class":1538},[1053,10414,1463],{"class":1113},[1053,10416,1649],{"class":1648},[1053,10418,9913],{"class":1652},[1053,10420,1649],{"class":1648},[1053,10422,1558],{"class":1113},[1053,10424,10426,10428,10431,10433,10435],{"class":1055,"line":10425},134,[1053,10427,9946],{"class":1402},[1053,10429,10430],{"class":1074}," product ",[1053,10432,5425],{"class":1402},[1053,10434,10167],{"class":1074},[1053,10436,1775],{"class":1113},[1053,10438,10440,10443,10445,10448,10450,10452,10454,10456,10459,10461,10463,10465,10467,10469,10471,10474,10476],{"class":1055,"line":10439},135,[1053,10441,10442],{"class":1074},"            product_client",[1053,10444,1422],{"class":1113},[1053,10446,10447],{"class":1538},"post",[1053,10449,1463],{"class":1113},[1053,10451,9568],{"class":1455},[1053,10453,9977],{"class":1652},[1053,10455,1114],{"class":1667},[1053,10457,10458],{"class":1538},"product",[1053,10460,4938],{"class":1113},[1053,10462,5738],{"class":1648},[1053,10464,1118],{"class":1652},[1053,10466,5738],{"class":1648},[1053,10468,4948],{"class":1113},[1053,10470,1121],{"class":1667},[1053,10472,10473],{"class":1652},"/reserve/'",[1053,10475,1506],{"class":1113},[1053,10477,2686],{"class":1113},[1053,10479,10481,10483,10486,10488,10490,10493],{"class":1055,"line":10480},136,[1053,10482,4373],{"class":1648},[1053,10484,10485],{"class":1652},"quantity",[1053,10487,1649],{"class":1648},[1053,10489,1658],{"class":1113},[1053,10491,10492],{"class":3330}," 1",[1053,10494,1636],{"class":1113},[1053,10496,10498,10500,10503,10505,10507,10509,10511],{"class":1055,"line":10497},137,[1053,10499,4373],{"class":1648},[1053,10501,10502],{"class":1652},"order_id",[1053,10504,1649],{"class":1648},[1053,10506,1658],{"class":1113},[1053,10508,10379],{"class":1538},[1053,10510,1422],{"class":1113},[1053,10512,10513],{"class":1555},"id\n",[1053,10515,10517],{"class":1055,"line":10516},138,[1053,10518,10519],{"class":1113},"            })\n",[1053,10521,10523],{"class":1055,"line":10522},139,[1053,10524,4091],{"class":1074},[1053,10526,10528],{"class":1055,"line":10527},140,[1053,10529,10530],{"class":1059},"        # Send notification\n",[1053,10532,10534,10537,10539,10541,10543,10545,10548,10550],{"class":1055,"line":10533},141,[1053,10535,10536],{"class":1074},"        notification_client ",[1053,10538,1530],{"class":1113},[1053,10540,8425],{"class":1538},[1053,10542,1463],{"class":1113},[1053,10544,1649],{"class":1648},[1053,10546,10547],{"class":1652},"notification-service",[1053,10549,1649],{"class":1648},[1053,10551,1558],{"class":1113},[1053,10553,10555,10558,10560,10562,10564,10566,10569,10571,10573],{"class":1055,"line":10554},142,[1053,10556,10557],{"class":1074},"        notification_client",[1053,10559,1422],{"class":1113},[1053,10561,10447],{"class":1538},[1053,10563,1463],{"class":1113},[1053,10565,1649],{"class":1648},[1053,10567,10568],{"class":1652},"api/v1/notifications/",[1053,10570,1649],{"class":1648},[1053,10572,1506],{"class":1113},[1053,10574,2686],{"class":1113},[1053,10576,10578,10580,10582,10584,10586,10588,10590,10592,10594,10596],{"class":1055,"line":10577},143,[1053,10579,4359],{"class":1648},[1053,10581,9735],{"class":1652},[1053,10583,1649],{"class":1648},[1053,10585,1658],{"class":1113},[1053,10587,9839],{"class":1538},[1053,10589,4938],{"class":1113},[1053,10591,1649],{"class":1648},[1053,10593,1118],{"class":1652},[1053,10595,1649],{"class":1648},[1053,10597,2758],{"class":1113},[1053,10599,10601,10603,10606,10608,10610,10612,10615,10617],{"class":1055,"line":10600},144,[1053,10602,4359],{"class":1648},[1053,10604,10605],{"class":1652},"type",[1053,10607,1649],{"class":1648},[1053,10609,1658],{"class":1113},[1053,10611,1884],{"class":1648},[1053,10613,10614],{"class":1652},"order_created",[1053,10616,1649],{"class":1648},[1053,10618,1636],{"class":1113},[1053,10620,10622,10624,10627,10629,10631,10633,10636,10638,10640,10642,10644,10646,10649],{"class":1055,"line":10621},145,[1053,10623,4359],{"class":1648},[1053,10625,10626],{"class":1652},"message",[1053,10628,1649],{"class":1648},[1053,10630,1658],{"class":1113},[1053,10632,1661],{"class":1455},[1053,10634,10635],{"class":1652},"'Your order #",[1053,10637,1114],{"class":1667},[1053,10639,10285],{"class":1538},[1053,10641,1422],{"class":1113},[1053,10643,1118],{"class":1555},[1053,10645,1121],{"class":1667},[1053,10647,10648],{"class":1652}," has been created'",[1053,10650,1636],{"class":1113},[1053,10652,10654,10656,10658,10660,10662,10664,10666,10668,10670,10672,10674,10676,10678],{"class":1055,"line":10653},146,[1053,10655,4359],{"class":1648},[1053,10657,4943],{"class":1652},[1053,10659,1649],{"class":1648},[1053,10661,1658],{"class":1113},[1053,10663,5752],{"class":1113},[1053,10665,1649],{"class":1648},[1053,10667,10502],{"class":1652},[1053,10669,1649],{"class":1648},[1053,10671,1658],{"class":1113},[1053,10673,10379],{"class":1538},[1053,10675,1422],{"class":1113},[1053,10677,1118],{"class":1555},[1053,10679,1682],{"class":1113},[1053,10681,10683],{"class":1055,"line":10682},147,[1053,10684,4533],{"class":1113},[1035,10686,10688],{"id":10687},"_2-circuit-breaker-pattern","2. Circuit Breaker Pattern",[1043,10690,10692],{"className":1045,"code":10691,"language":1047,"meta":1048,"style":1048},"# circuit_breaker.py\nimport time\nimport threading\nfrom enum import Enum\nfrom typing import Callable, Any\nfrom functools import wraps\n\nclass CircuitState(Enum):\n    CLOSED = \"closed\"\n    OPEN = \"open\"\n    HALF_OPEN = \"half_open\"\n\nclass CircuitBreaker:\n    \"\"\"Circuit breaker for service calls\"\"\"\n    \n    def __init__(self, failure_threshold: int = 5, timeout: int = 60, expected_exception: Exception = Exception):\n        self.failure_threshold = failure_threshold\n        self.timeout = timeout\n        self.expected_exception = expected_exception\n        \n        self.failure_count = 0\n        self.last_failure_time = None\n        self.state = CircuitState.CLOSED\n        self.lock = threading.Lock()\n    \n    def __call__(self, func: Callable) -> Callable:\n        @wraps(func)\n        def wrapper(*args, **kwargs):\n            return self.call(func, *args, **kwargs)\n        return wrapper\n    \n    def call(self, func: Callable, *args, **kwargs) -> Any:\n        \"\"\"Execute function with circuit breaker protection\"\"\"\n        with self.lock:\n            if self.state == CircuitState.OPEN:\n                if self._should_attempt_reset():\n                    self.state = CircuitState.HALF_OPEN\n                else:\n                    raise Exception(\"Circuit breaker is OPEN\")\n            \n            try:\n                result = func(*args, **kwargs)\n                self._on_success()\n                return result\n            \n            except self.expected_exception as e:\n                self._on_failure()\n                raise e\n    \n    def _should_attempt_reset(self) -> bool:\n        \"\"\"Check if enough time has passed to attempt reset\"\"\"\n        return (\n            self.last_failure_time and\n            time.time() - self.last_failure_time >= self.timeout\n        )\n    \n    def _on_success(self):\n        \"\"\"Handle successful call\"\"\"\n        self.failure_count = 0\n        self.state = CircuitState.CLOSED\n    \n    def _on_failure(self):\n        \"\"\"Handle failed call\"\"\"\n        self.failure_count += 1\n        self.last_failure_time = time.time()\n        \n        if self.failure_count >= self.failure_threshold:\n            self.state = CircuitState.OPEN\n\n# Usage\nclass ResilientServiceClient(ServiceClient):\n    \"\"\"Service client with circuit breaker\"\"\"\n    \n    def __init__(self, service_name: str, base_url: str = None):\n        super().__init__(service_name, base_url)\n        self.circuit_breaker = CircuitBreaker(\n            failure_threshold=3,\n            timeout=30,\n            expected_exception=requests.RequestException\n        )\n    \n    @property\n    def get(self):\n        return self.circuit_breaker(super().get)\n    \n    @property\n    def post(self):\n        return self.circuit_breaker(super().post)\n    \n    @property\n    def put(self):\n        return self.circuit_breaker(super().put)\n    \n    @property\n    def delete(self):\n        return self.circuit_breaker(super().delete)\n",[1050,10693,10694,10699,10706,10713,10725,10740,10752,10756,10770,10785,10799,10813,10817,10826,10835,10839,10892,10906,10919,10933,10937,10950,10963,10981,11002,11006,11034,11049,11071,11100,11107,11111,11151,11160,11173,11194,11208,11226,11233,11251,11255,11262,11285,11296,11303,11307,11324,11335,11343,11347,11366,11375,11382,11393,11423,11428,11432,11445,11454,11466,11482,11486,11499,11508,11522,11541,11545,11565,11582,11586,11591,11605,11614,11618,11650,11668,11683,11695,11707,11722,11726,11730,11737,11749,11770,11774,11780,11792,11812,11816,11822,11834,11855,11859,11865,11877],{"__ignoreMap":1048},[1053,10695,10696],{"class":1055,"line":1056},[1053,10697,10698],{"class":1059},"# circuit_breaker.py\n",[1053,10700,10701,10703],{"class":1055,"line":1063},[1053,10702,1409],{"class":1402},[1053,10704,10705],{"class":1074}," time\n",[1053,10707,10708,10710],{"class":1055,"line":1094},[1053,10709,1409],{"class":1402},[1053,10711,10712],{"class":1074}," threading\n",[1053,10714,10715,10717,10720,10722],{"class":1055,"line":1129},[1053,10716,1403],{"class":1402},[1053,10718,10719],{"class":1074}," enum ",[1053,10721,1409],{"class":1402},[1053,10723,10724],{"class":1074}," Enum\n",[1053,10726,10727,10729,10731,10733,10736,10738],{"class":1055,"line":1153},[1053,10728,1403],{"class":1402},[1053,10730,8365],{"class":1074},[1053,10732,1409],{"class":1402},[1053,10734,10735],{"class":1074}," Callable",[1053,10737,1506],{"class":1113},[1053,10739,8380],{"class":1074},[1053,10741,10742,10744,10747,10749],{"class":1055,"line":1184},[1053,10743,1403],{"class":1402},[1053,10745,10746],{"class":1074}," functools ",[1053,10748,1409],{"class":1402},[1053,10750,10751],{"class":1074}," wraps\n",[1053,10753,10754],{"class":1055,"line":1216},[1053,10755,1220],{"emptyLinePlaceholder":1219},[1053,10757,10758,10760,10763,10765,10768],{"class":1055,"line":1223},[1053,10759,1456],{"class":1455},[1053,10761,10762],{"class":1459}," CircuitState",[1053,10764,1463],{"class":1113},[1053,10766,10767],{"class":1466},"Enum",[1053,10769,1470],{"class":1113},[1053,10771,10772,10775,10777,10780,10783],{"class":1055,"line":1229},[1053,10773,10774],{"class":1066},"    CLOSED",[1053,10776,2683],{"class":1113},[1053,10778,10779],{"class":1648}," \"",[1053,10781,10782],{"class":1652},"closed",[1053,10784,8704],{"class":1648},[1053,10786,10787,10790,10792,10794,10797],{"class":1055,"line":1264},[1053,10788,10789],{"class":1066},"    OPEN",[1053,10791,2683],{"class":1113},[1053,10793,10779],{"class":1648},[1053,10795,10796],{"class":1652},"open",[1053,10798,8704],{"class":1648},[1053,10800,10801,10804,10806,10808,10811],{"class":1055,"line":1298},[1053,10802,10803],{"class":1066},"    HALF_OPEN",[1053,10805,2683],{"class":1113},[1053,10807,10779],{"class":1648},[1053,10809,10810],{"class":1652},"half_open",[1053,10812,8704],{"class":1648},[1053,10814,10815],{"class":1055,"line":1303},[1053,10816,1220],{"emptyLinePlaceholder":1219},[1053,10818,10819,10821,10824],{"class":1055,"line":1309},[1053,10820,1456],{"class":1455},[1053,10822,10823],{"class":1459}," CircuitBreaker",[1053,10825,1775],{"class":1113},[1053,10827,10828,10830,10833],{"class":1055,"line":1330},[1053,10829,1476],{"class":1475},[1053,10831,10832],{"class":1479},"Circuit breaker for service calls",[1053,10834,1483],{"class":1475},[1053,10836,10837],{"class":1055,"line":1358},[1053,10838,1488],{"class":1074},[1053,10840,10841,10843,10845,10847,10849,10851,10854,10856,10858,10860,10863,10865,10867,10869,10871,10873,10876,10878,10881,10883,10886,10888,10890],{"class":1055,"line":1619},[1053,10842,1493],{"class":1455},[1053,10844,5243],{"class":1117},[1053,10846,1463],{"class":1113},[1053,10848,1503],{"class":1502},[1053,10850,1506],{"class":1113},[1053,10852,10853],{"class":1509}," failure_threshold",[1053,10855,1658],{"class":1113},[1053,10857,8913],{"class":4076},[1053,10859,2683],{"class":1113},[1053,10861,10862],{"class":3330}," 5",[1053,10864,1506],{"class":1113},[1053,10866,8829],{"class":1509},[1053,10868,1658],{"class":1113},[1053,10870,8913],{"class":4076},[1053,10872,2683],{"class":1113},[1053,10874,10875],{"class":3330}," 60",[1053,10877,1506],{"class":1113},[1053,10879,10880],{"class":1509}," expected_exception",[1053,10882,1658],{"class":1113},[1053,10884,10885],{"class":4076}," Exception",[1053,10887,2683],{"class":1113},[1053,10889,10885],{"class":4076},[1053,10891,1470],{"class":1113},[1053,10893,10894,10896,10898,10901,10903],{"class":1055,"line":1639},[1053,10895,8480],{"class":1066},[1053,10897,1422],{"class":1113},[1053,10899,10900],{"class":1555},"failure_threshold",[1053,10902,2683],{"class":1113},[1053,10904,10905],{"class":1074}," failure_threshold\n",[1053,10907,10908,10910,10912,10914,10916],{"class":1055,"line":1685},[1053,10909,8480],{"class":1066},[1053,10911,1422],{"class":1113},[1053,10913,8982],{"class":1555},[1053,10915,2683],{"class":1113},[1053,10917,10918],{"class":1074}," timeout\n",[1053,10920,10921,10923,10925,10928,10930],{"class":1055,"line":1691},[1053,10922,8480],{"class":1066},[1053,10924,1422],{"class":1113},[1053,10926,10927],{"class":1555},"expected_exception",[1053,10929,2683],{"class":1113},[1053,10931,10932],{"class":1074}," expected_exception\n",[1053,10934,10935],{"class":1055,"line":1725},[1053,10936,4091],{"class":1074},[1053,10938,10939,10941,10943,10946,10948],{"class":1055,"line":1730},[1053,10940,8480],{"class":1066},[1053,10942,1422],{"class":1113},[1053,10944,10945],{"class":1555},"failure_count",[1053,10947,2683],{"class":1113},[1053,10949,9937],{"class":3330},[1053,10951,10952,10954,10956,10959,10961],{"class":1055,"line":1759},[1053,10953,8480],{"class":1066},[1053,10955,1422],{"class":1113},[1053,10957,10958],{"class":1555},"last_failure_time",[1053,10960,2683],{"class":1113},[1053,10962,5968],{"class":1753},[1053,10964,10965,10967,10969,10972,10974,10976,10978],{"class":1055,"line":1769},[1053,10966,8480],{"class":1066},[1053,10968,1422],{"class":1113},[1053,10970,10971],{"class":1555},"state",[1053,10973,2683],{"class":1113},[1053,10975,10762],{"class":1074},[1053,10977,1422],{"class":1113},[1053,10979,10980],{"class":1632},"CLOSED\n",[1053,10982,10983,10985,10987,10990,10992,10995,10997,11000],{"class":1055,"line":1778},[1053,10984,8480],{"class":1066},[1053,10986,1422],{"class":1113},[1053,10988,10989],{"class":1555},"lock",[1053,10991,2683],{"class":1113},[1053,10993,10994],{"class":1074}," threading",[1053,10996,1422],{"class":1113},[1053,10998,10999],{"class":1538},"Lock",[1053,11001,1591],{"class":1113},[1053,11003,11004],{"class":1055,"line":1794},[1053,11005,1488],{"class":1074},[1053,11007,11008,11010,11013,11015,11017,11019,11022,11024,11026,11028,11030,11032],{"class":1055,"line":1814},[1053,11009,1493],{"class":1455},[1053,11011,11012],{"class":1117}," __call__",[1053,11014,1463],{"class":1113},[1053,11016,1503],{"class":1502},[1053,11018,1506],{"class":1113},[1053,11020,11021],{"class":1509}," func",[1053,11023,1658],{"class":1113},[1053,11025,10735],{"class":1074},[1053,11027,8662],{"class":1113},[1053,11029,8665],{"class":1113},[1053,11031,10735],{"class":1074},[1053,11033,1775],{"class":1113},[1053,11035,11036,11039,11042,11044,11047],{"class":1055,"line":1844},[1053,11037,11038],{"class":1113},"        @",[1053,11040,11041],{"class":1496},"wraps",[1053,11043,1463],{"class":1113},[1053,11045,11046],{"class":1538},"func",[1053,11048,1558],{"class":1113},[1053,11050,11051,11054,11057,11059,11061,11063,11065,11067,11069],{"class":1055,"line":1860},[1053,11052,11053],{"class":1455},"        def",[1053,11055,11056],{"class":1496}," wrapper",[1053,11058,1463],{"class":1113},[1053,11060,3327],{"class":1070},[1053,11062,5255],{"class":1509},[1053,11064,1506],{"class":1113},[1053,11066,5260],{"class":1070},[1053,11068,5263],{"class":1509},[1053,11070,1470],{"class":1113},[1053,11072,11073,11075,11077,11079,11082,11084,11086,11088,11090,11092,11094,11096,11098],{"class":1055,"line":1869},[1053,11074,1596],{"class":1402},[1053,11076,1533],{"class":1066},[1053,11078,1422],{"class":1113},[1053,11080,11081],{"class":1538},"call",[1053,11083,1463],{"class":1113},[1053,11085,11046],{"class":1538},[1053,11087,1506],{"class":1113},[1053,11089,5252],{"class":1070},[1053,11091,5255],{"class":1538},[1053,11093,1506],{"class":1113},[1053,11095,5260],{"class":1070},[1053,11097,5263],{"class":1538},[1053,11099,1558],{"class":1113},[1053,11101,11102,11104],{"class":1055,"line":1897},[1053,11103,1694],{"class":1402},[1053,11105,11106],{"class":1074}," wrapper\n",[1053,11108,11109],{"class":1055,"line":1911},[1053,11110,1488],{"class":1074},[1053,11112,11113,11115,11118,11120,11122,11124,11126,11128,11130,11132,11134,11136,11138,11140,11142,11144,11146,11149],{"class":1055,"line":1916},[1053,11114,1493],{"class":1455},[1053,11116,11117],{"class":1496}," call",[1053,11119,1463],{"class":1113},[1053,11121,1503],{"class":1502},[1053,11123,1506],{"class":1113},[1053,11125,11021],{"class":1509},[1053,11127,1658],{"class":1113},[1053,11129,10735],{"class":1074},[1053,11131,1506],{"class":1113},[1053,11133,5252],{"class":1070},[1053,11135,5255],{"class":1509},[1053,11137,1506],{"class":1113},[1053,11139,5260],{"class":1070},[1053,11141,5263],{"class":1509},[1053,11143,8662],{"class":1113},[1053,11145,8665],{"class":1113},[1053,11147,11148],{"class":1074}," Any",[1053,11150,1775],{"class":1113},[1053,11152,11153,11155,11158],{"class":1055,"line":1921},[1053,11154,1517],{"class":1475},[1053,11156,11157],{"class":1479},"Execute function with circuit breaker protection",[1053,11159,1483],{"class":1475},[1053,11161,11162,11165,11167,11169,11171],{"class":1055,"line":1947},[1053,11163,11164],{"class":1402},"        with",[1053,11166,1533],{"class":1066},[1053,11168,1422],{"class":1113},[1053,11170,10989],{"class":1555},[1053,11172,1775],{"class":1113},[1053,11174,11175,11177,11179,11181,11183,11185,11187,11189,11192],{"class":1055,"line":1957},[1053,11176,8802],{"class":1402},[1053,11178,1533],{"class":1066},[1053,11180,1422],{"class":1113},[1053,11182,10971],{"class":1555},[1053,11184,2833],{"class":1070},[1053,11186,10762],{"class":1074},[1053,11188,1422],{"class":1113},[1053,11190,11191],{"class":1632},"OPEN",[1053,11193,1775],{"class":1113},[1053,11195,11196,11199,11201,11203,11206],{"class":1055,"line":1973},[1053,11197,11198],{"class":1402},"                if",[1053,11200,1533],{"class":1066},[1053,11202,1422],{"class":1113},[1053,11204,11205],{"class":1538},"_should_attempt_reset",[1053,11207,1574],{"class":1113},[1053,11209,11210,11213,11215,11217,11219,11221,11223],{"class":1055,"line":2005},[1053,11211,11212],{"class":1066},"                    self",[1053,11214,1422],{"class":1113},[1053,11216,10971],{"class":1555},[1053,11218,2683],{"class":1113},[1053,11220,10762],{"class":1074},[1053,11222,1422],{"class":1113},[1053,11224,11225],{"class":1632},"HALF_OPEN\n",[1053,11227,11228,11231],{"class":1055,"line":2018},[1053,11229,11230],{"class":1402},"                else",[1053,11232,1775],{"class":1113},[1053,11234,11235,11238,11240,11242,11244,11247,11249],{"class":1055,"line":2030},[1053,11236,11237],{"class":1402},"                    raise",[1053,11239,10885],{"class":4076},[1053,11241,1463],{"class":1113},[1053,11243,5738],{"class":1648},[1053,11245,11246],{"class":1652},"Circuit breaker is OPEN",[1053,11248,5738],{"class":1648},[1053,11250,1558],{"class":1113},[1053,11252,11253],{"class":1055,"line":2059},[1053,11254,4921],{"class":1074},[1053,11256,11257,11260],{"class":1055,"line":2088},[1053,11258,11259],{"class":1402},"            try",[1053,11261,1775],{"class":1113},[1053,11263,11264,11267,11269,11271,11273,11275,11277,11279,11281,11283],{"class":1055,"line":2093},[1053,11265,11266],{"class":1074},"                result ",[1053,11268,1530],{"class":1113},[1053,11270,11021],{"class":1538},[1053,11272,1463],{"class":1113},[1053,11274,3327],{"class":1070},[1053,11276,5255],{"class":1538},[1053,11278,1506],{"class":1113},[1053,11280,5260],{"class":1070},[1053,11282,5263],{"class":1538},[1053,11284,1558],{"class":1113},[1053,11286,11287,11289,11291,11294],{"class":1055,"line":2119},[1053,11288,5441],{"class":1066},[1053,11290,1422],{"class":1113},[1053,11292,11293],{"class":1538},"_on_success",[1053,11295,1591],{"class":1113},[1053,11297,11298,11300],{"class":1055,"line":2129},[1053,11299,9506],{"class":1402},[1053,11301,11302],{"class":1074}," result\n",[1053,11304,11305],{"class":1055,"line":2144},[1053,11306,4921],{"class":1074},[1053,11308,11309,11312,11314,11316,11318,11320,11322],{"class":1055,"line":2185},[1053,11310,11311],{"class":1402},"            except",[1053,11313,1533],{"class":1066},[1053,11315,1422],{"class":1113},[1053,11317,10927],{"class":1555},[1053,11319,9549],{"class":1402},[1053,11321,9552],{"class":1074},[1053,11323,1775],{"class":1113},[1053,11325,11326,11328,11330,11333],{"class":1055,"line":2198},[1053,11327,5441],{"class":1066},[1053,11329,1422],{"class":1113},[1053,11331,11332],{"class":1538},"_on_failure",[1053,11334,1591],{"class":1113},[1053,11336,11337,11340],{"class":1055,"line":2209},[1053,11338,11339],{"class":1402},"                raise",[1053,11341,11342],{"class":1074}," e\n",[1053,11344,11345],{"class":1055,"line":2238},[1053,11346,1488],{"class":1074},[1053,11348,11349,11351,11354,11356,11358,11360,11362,11364],{"class":1055,"line":2267},[1053,11350,1493],{"class":1455},[1053,11352,11353],{"class":1496}," _should_attempt_reset",[1053,11355,1463],{"class":1113},[1053,11357,1503],{"class":1502},[1053,11359,8662],{"class":1113},[1053,11361,8665],{"class":1113},[1053,11363,9243],{"class":4076},[1053,11365,1775],{"class":1113},[1053,11367,11368,11370,11373],{"class":1055,"line":2272},[1053,11369,1517],{"class":1475},[1053,11371,11372],{"class":1479},"Check if enough time has passed to attempt reset",[1053,11374,1483],{"class":1475},[1053,11376,11377,11379],{"class":1055,"line":2298},[1053,11378,1694],{"class":1402},[1053,11380,11381],{"class":1113}," (\n",[1053,11383,11384,11386,11388,11390],{"class":1055,"line":2308},[1053,11385,10275],{"class":1066},[1053,11387,1422],{"class":1113},[1053,11389,10958],{"class":1555},[1053,11391,11392],{"class":1070}," and\n",[1053,11394,11395,11398,11400,11403,11405,11407,11409,11411,11413,11416,11418,11420],{"class":1055,"line":2323},[1053,11396,11397],{"class":1074},"            time",[1053,11399,1422],{"class":1113},[1053,11401,11402],{"class":1538},"time",[1053,11404,3308],{"class":1113},[1053,11406,3311],{"class":1070},[1053,11408,1533],{"class":1066},[1053,11410,1422],{"class":1113},[1053,11412,10958],{"class":1555},[1053,11414,11415],{"class":1070}," >=",[1053,11417,1533],{"class":1066},[1053,11419,1422],{"class":1113},[1053,11421,11422],{"class":1555},"timeout\n",[1053,11424,11425],{"class":1055,"line":2336},[1053,11426,11427],{"class":1113},"        )\n",[1053,11429,11430],{"class":1055,"line":3912},[1053,11431,1488],{"class":1074},[1053,11433,11434,11436,11439,11441,11443],{"class":1055,"line":3925},[1053,11435,1493],{"class":1455},[1053,11437,11438],{"class":1496}," _on_success",[1053,11440,1463],{"class":1113},[1053,11442,1503],{"class":1502},[1053,11444,1470],{"class":1113},[1053,11446,11447,11449,11452],{"class":1055,"line":3935},[1053,11448,1517],{"class":1475},[1053,11450,11451],{"class":1479},"Handle successful call",[1053,11453,1483],{"class":1475},[1053,11455,11456,11458,11460,11462,11464],{"class":1055,"line":3941},[1053,11457,8480],{"class":1066},[1053,11459,1422],{"class":1113},[1053,11461,10945],{"class":1555},[1053,11463,2683],{"class":1113},[1053,11465,9937],{"class":3330},[1053,11467,11468,11470,11472,11474,11476,11478,11480],{"class":1055,"line":3952},[1053,11469,8480],{"class":1066},[1053,11471,1422],{"class":1113},[1053,11473,10971],{"class":1555},[1053,11475,2683],{"class":1113},[1053,11477,10762],{"class":1074},[1053,11479,1422],{"class":1113},[1053,11481,10980],{"class":1632},[1053,11483,11484],{"class":1055,"line":3996},[1053,11485,1488],{"class":1074},[1053,11487,11488,11490,11493,11495,11497],{"class":1055,"line":4030},[1053,11489,1493],{"class":1455},[1053,11491,11492],{"class":1496}," _on_failure",[1053,11494,1463],{"class":1113},[1053,11496,1503],{"class":1502},[1053,11498,1470],{"class":1113},[1053,11500,11501,11503,11506],{"class":1055,"line":4049},[1053,11502,1517],{"class":1475},[1053,11504,11505],{"class":1479},"Handle failed call",[1053,11507,1483],{"class":1475},[1053,11509,11510,11512,11514,11516,11519],{"class":1055,"line":4054},[1053,11511,8480],{"class":1066},[1053,11513,1422],{"class":1113},[1053,11515,10945],{"class":1555},[1053,11517,11518],{"class":1113}," +=",[1053,11520,11521],{"class":3330}," 1\n",[1053,11523,11524,11526,11528,11530,11532,11535,11537,11539],{"class":1055,"line":4068},[1053,11525,8480],{"class":1066},[1053,11527,1422],{"class":1113},[1053,11529,10958],{"class":1555},[1053,11531,2683],{"class":1113},[1053,11533,11534],{"class":1074}," time",[1053,11536,1422],{"class":1113},[1053,11538,11402],{"class":1538},[1053,11540,1591],{"class":1113},[1053,11542,11543],{"class":1055,"line":4088},[1053,11544,4091],{"class":1074},[1053,11546,11547,11549,11551,11553,11555,11557,11559,11561,11563],{"class":1055,"line":4094},[1053,11548,1563],{"class":1402},[1053,11550,1533],{"class":1066},[1053,11552,1422],{"class":1113},[1053,11554,10945],{"class":1555},[1053,11556,11415],{"class":1070},[1053,11558,1533],{"class":1066},[1053,11560,1422],{"class":1113},[1053,11562,10900],{"class":1555},[1053,11564,1775],{"class":1113},[1053,11566,11567,11569,11571,11573,11575,11577,11579],{"class":1055,"line":4100},[1053,11568,10275],{"class":1066},[1053,11570,1422],{"class":1113},[1053,11572,10971],{"class":1555},[1053,11574,2683],{"class":1113},[1053,11576,10762],{"class":1074},[1053,11578,1422],{"class":1113},[1053,11580,11581],{"class":1632},"OPEN\n",[1053,11583,11584],{"class":1055,"line":4135},[1053,11585,1220],{"emptyLinePlaceholder":1219},[1053,11587,11588],{"class":1055,"line":4145},[1053,11589,11590],{"class":1059},"# Usage\n",[1053,11592,11593,11595,11598,11600,11603],{"class":1055,"line":4161},[1053,11594,1456],{"class":1455},[1053,11596,11597],{"class":1459}," ResilientServiceClient",[1053,11599,1463],{"class":1113},[1053,11601,11602],{"class":1466},"ServiceClient",[1053,11604,1470],{"class":1113},[1053,11606,11607,11609,11612],{"class":1055,"line":4172},[1053,11608,1476],{"class":1475},[1053,11610,11611],{"class":1479},"Service client with circuit breaker",[1053,11613,1483],{"class":1475},[1053,11615,11616],{"class":1055,"line":4183},[1053,11617,1488],{"class":1074},[1053,11619,11620,11622,11624,11626,11628,11630,11632,11634,11636,11638,11640,11642,11644,11646,11648],{"class":1055,"line":4188},[1053,11621,1493],{"class":1455},[1053,11623,5243],{"class":1117},[1053,11625,1463],{"class":1113},[1053,11627,1503],{"class":1502},[1053,11629,1506],{"class":1113},[1053,11631,8455],{"class":1509},[1053,11633,1658],{"class":1113},[1053,11635,8460],{"class":4076},[1053,11637,1506],{"class":1113},[1053,11639,8465],{"class":1509},[1053,11641,1658],{"class":1113},[1053,11643,8460],{"class":4076},[1053,11645,2683],{"class":1113},[1053,11647,4863],{"class":1753},[1053,11649,1470],{"class":1113},[1053,11651,11652,11654,11656,11658,11660,11662,11664,11666],{"class":1055,"line":4196},[1053,11653,5336],{"class":4076},[1053,11655,4080],{"class":1113},[1053,11657,5341],{"class":1117},[1053,11659,1463],{"class":1113},[1053,11661,8485],{"class":1538},[1053,11663,1506],{"class":1113},[1053,11665,8465],{"class":1538},[1053,11667,1558],{"class":1113},[1053,11669,11670,11672,11674,11677,11679,11681],{"class":1055,"line":4201},[1053,11671,8480],{"class":1066},[1053,11673,1422],{"class":1113},[1053,11675,11676],{"class":1555},"circuit_breaker",[1053,11678,2683],{"class":1113},[1053,11680,10823],{"class":1538},[1053,11682,1602],{"class":1113},[1053,11684,11685,11688,11690,11693],{"class":1055,"line":4207},[1053,11686,11687],{"class":1544},"            failure_threshold",[1053,11689,1530],{"class":1113},[1053,11691,11692],{"class":3330},"3",[1053,11694,1636],{"class":1113},[1053,11696,11697,11700,11702,11705],{"class":1055,"line":4213},[1053,11698,11699],{"class":1544},"            timeout",[1053,11701,1530],{"class":1113},[1053,11703,11704],{"class":3330},"30",[1053,11706,1636],{"class":1113},[1053,11708,11709,11712,11714,11717,11719],{"class":1055,"line":4219},[1053,11710,11711],{"class":1544},"            expected_exception",[1053,11713,1530],{"class":1113},[1053,11715,11716],{"class":1538},"requests",[1053,11718,1422],{"class":1113},[1053,11720,11721],{"class":1555},"RequestException\n",[1053,11723,11724],{"class":1055,"line":6240},[1053,11725,11427],{"class":1113},[1053,11727,11728],{"class":1055,"line":6245},[1053,11729,1488],{"class":1074},[1053,11731,11732,11734],{"class":1055,"line":6263},[1053,11733,7121],{"class":1113},[1053,11735,11736],{"class":4076},"property\n",[1053,11738,11739,11741,11743,11745,11747],{"class":1055,"line":6298},[1053,11740,1493],{"class":1455},[1053,11742,8877],{"class":1496},[1053,11744,1463],{"class":1113},[1053,11746,1503],{"class":1502},[1053,11748,1470],{"class":1113},[1053,11750,11751,11753,11755,11757,11759,11761,11764,11766,11768],{"class":1055,"line":6337},[1053,11752,1694],{"class":1402},[1053,11754,1533],{"class":1066},[1053,11756,1422],{"class":1113},[1053,11758,11676],{"class":1538},[1053,11760,1463],{"class":1113},[1053,11762,11763],{"class":4076},"super",[1053,11765,4080],{"class":1113},[1053,11767,4121],{"class":1555},[1053,11769,1558],{"class":1113},[1053,11771,11772],{"class":1055,"line":6342},[1053,11773,1488],{"class":1074},[1053,11775,11776,11778],{"class":1055,"line":6347},[1053,11777,7121],{"class":1113},[1053,11779,11736],{"class":4076},[1053,11781,11782,11784,11786,11788,11790],{"class":1055,"line":6360},[1053,11783,1493],{"class":1455},[1053,11785,8995],{"class":1496},[1053,11787,1463],{"class":1113},[1053,11789,1503],{"class":1502},[1053,11791,1470],{"class":1113},[1053,11793,11794,11796,11798,11800,11802,11804,11806,11808,11810],{"class":1055,"line":6379},[1053,11795,1694],{"class":1402},[1053,11797,1533],{"class":1066},[1053,11799,1422],{"class":1113},[1053,11801,11676],{"class":1538},[1053,11803,1463],{"class":1113},[1053,11805,11763],{"class":4076},[1053,11807,4080],{"class":1113},[1053,11809,10447],{"class":1555},[1053,11811,1558],{"class":1113},[1053,11813,11814],{"class":1055,"line":6384},[1053,11815,1488],{"class":1074},[1053,11817,11818,11820],{"class":1055,"line":6397},[1053,11819,7121],{"class":1113},[1053,11821,11736],{"class":4076},[1053,11823,11824,11826,11828,11830,11832],{"class":1055,"line":6420},[1053,11825,1493],{"class":1455},[1053,11827,9104],{"class":1496},[1053,11829,1463],{"class":1113},[1053,11831,1503],{"class":1502},[1053,11833,1470],{"class":1113},[1053,11835,11836,11838,11840,11842,11844,11846,11848,11850,11853],{"class":1055,"line":6428},[1053,11837,1694],{"class":1402},[1053,11839,1533],{"class":1066},[1053,11841,1422],{"class":1113},[1053,11843,11676],{"class":1538},[1053,11845,1463],{"class":1113},[1053,11847,11763],{"class":4076},[1053,11849,4080],{"class":1113},[1053,11851,11852],{"class":1555},"put",[1053,11854,1558],{"class":1113},[1053,11856,11857],{"class":1055,"line":6451},[1053,11858,1488],{"class":1074},[1053,11860,11861,11863],{"class":1055,"line":6459},[1053,11862,7121],{"class":1113},[1053,11864,11736],{"class":4076},[1053,11866,11867,11869,11871,11873,11875],{"class":1055,"line":6466},[1053,11868,1493],{"class":1455},[1053,11870,9212],{"class":1496},[1053,11872,1463],{"class":1113},[1053,11874,1503],{"class":1502},[1053,11876,1470],{"class":1113},[1053,11878,11879,11881,11883,11885,11887,11889,11891,11893,11895],{"class":1055,"line":6471},[1053,11880,1694],{"class":1402},[1053,11882,1533],{"class":1066},[1053,11884,1422],{"class":1113},[1053,11886,11676],{"class":1538},[1053,11888,1463],{"class":1113},[1053,11890,11763],{"class":4076},[1053,11892,4080],{"class":1113},[1053,11894,2331],{"class":1555},[1053,11896,1558],{"class":1113},[1035,11898,11900],{"id":11899},"_3-api-rate-limiting","3. API Rate Limiting",[1043,11902,11904],{"className":1045,"code":11903,"language":1047,"meta":1048,"style":1048},"# throttling.py\nfrom rest_framework.throttling import UserRateThrottle, AnonRateThrottle\nfrom django.core.cache import cache\nimport time\n\nclass ServiceRateThrottle(UserRateThrottle):\n    \"\"\"Rate limiting for inter-service communication\"\"\"\n    scope = 'service'\n    \n    def get_cache_key(self, request, view):\n        # Use service token for identification\n        service_token = request.META.get('HTTP_X_SERVICE_TOKEN')\n        if service_token:\n            return f\"throttle_service_{service_token}\"\n        return super().get_cache_key(request, view)\n\nclass BurstRateThrottle(UserRateThrottle):\n    \"\"\"Allow burst requests with sustained rate limiting\"\"\"\n    scope = 'burst'\n    \n    def allow_request(self, request, view):\n        # Allow burst of requests, then apply sustained rate\n        cache_key = self.get_cache_key(request, view)\n        if not cache_key:\n            return True\n        \n        now = time.time()\n        burst_key = f\"{cache_key}_burst\"\n        sustained_key = f\"{cache_key}_sustained\"\n        \n        # Check burst limit (e.g., 100 requests in 1 minute)\n        burst_requests = cache.get(burst_key, [])\n        burst_requests = [req_time for req_time in burst_requests if now - req_time \u003C 60]\n        \n        if len(burst_requests) >= 100:\n            return False\n        \n        # Check sustained limit (e.g., 1000 requests per hour)\n        sustained_requests = cache.get(sustained_key, [])\n        sustained_requests = [req_time for req_time in sustained_requests if now - req_time \u003C 3600]\n        \n        if len(sustained_requests) >= 1000:\n            return False\n        \n        # Update counters\n        burst_requests.append(now)\n        sustained_requests.append(now)\n        cache.set(burst_key, burst_requests, 60)\n        cache.set(sustained_key, sustained_requests, 3600)\n        \n        return True\n\n# settings.py\nREST_FRAMEWORK = {\n    'DEFAULT_THROTTLE_CLASSES': [\n        'rest_framework.throttling.AnonRateThrottle',\n        'rest_framework.throttling.UserRateThrottle',\n        'myapp.throttling.ServiceRateThrottle',\n    ],\n    'DEFAULT_THROTTLE_RATES': {\n        'anon': '100/hour',\n        'user': '1000/hour',\n        'service': '10000/hour',\n        'burst': '100/min',\n    }\n}\n\n# views.py\nfrom rest_framework.throttling import UserRateThrottle\n\nclass UserViewSet(ModelViewSet):\n    throttle_classes = [BurstRateThrottle, ServiceRateThrottle]\n    throttle_scope = 'user'\n    \n    def get_throttles(self):\n        \"\"\"Apply different throttling based on request type\"\"\"\n        if self.request.META.get('HTTP_X_SERVICE_TOKEN'):\n            # Inter-service requests get higher limits\n            return [ServiceRateThrottle()]\n        return super().get_throttles()\n",[1050,11905,11906,11911,11932,11950,11956,11960,11974,11983,11997,12001,12023,12028,12057,12066,12084,12105,12109,12122,12131,12144,12148,12169,12174,12196,12207,12214,12218,12233,12253,12273,12277,12282,12304,12343,12347,12368,12375,12379,12384,12406,12440,12444,12464,12470,12474,12479,12494,12509,12533,12556,12560,12566,12570,12574,12582,12595,12607,12618,12629,12634,12647,12667,12686,12705,12724,12729,12733,12737,12741,12756,12760,12772,12790,12803,12807,12820,12829,12857,12862,12874],{"__ignoreMap":1048},[1053,11907,11908],{"class":1055,"line":1056},[1053,11909,11910],{"class":1059},"# throttling.py\n",[1053,11912,11913,11915,11917,11919,11922,11924,11927,11929],{"class":1055,"line":1063},[1053,11914,1403],{"class":1402},[1053,11916,1419],{"class":1074},[1053,11918,1422],{"class":1113},[1053,11920,11921],{"class":1074},"throttling ",[1053,11923,1409],{"class":1402},[1053,11925,11926],{"class":1074}," UserRateThrottle",[1053,11928,1506],{"class":1113},[1053,11930,11931],{"class":1074}," AnonRateThrottle\n",[1053,11933,11934,11936,11938,11940,11942,11944,11946,11948],{"class":1055,"line":1094},[1053,11935,1403],{"class":1402},[1053,11937,2376],{"class":1074},[1053,11939,1422],{"class":1113},[1053,11941,8348],{"class":1074},[1053,11943,1422],{"class":1113},[1053,11945,8353],{"class":1074},[1053,11947,1409],{"class":1402},[1053,11949,8358],{"class":1074},[1053,11951,11952,11954],{"class":1055,"line":1129},[1053,11953,1409],{"class":1402},[1053,11955,10705],{"class":1074},[1053,11957,11958],{"class":1055,"line":1153},[1053,11959,1220],{"emptyLinePlaceholder":1219},[1053,11961,11962,11964,11967,11969,11972],{"class":1055,"line":1184},[1053,11963,1456],{"class":1455},[1053,11965,11966],{"class":1459}," ServiceRateThrottle",[1053,11968,1463],{"class":1113},[1053,11970,11971],{"class":1466},"UserRateThrottle",[1053,11973,1470],{"class":1113},[1053,11975,11976,11978,11981],{"class":1055,"line":1216},[1053,11977,1476],{"class":1475},[1053,11979,11980],{"class":1479},"Rate limiting for inter-service communication",[1053,11982,1483],{"class":1475},[1053,11984,11985,11988,11990,11992,11995],{"class":1055,"line":1223},[1053,11986,11987],{"class":1074},"    scope ",[1053,11989,1530],{"class":1113},[1053,11991,1884],{"class":1648},[1053,11993,11994],{"class":1652},"service",[1053,11996,4314],{"class":1648},[1053,11998,11999],{"class":1055,"line":1229},[1053,12000,1488],{"class":1074},[1053,12002,12003,12005,12008,12010,12012,12014,12016,12018,12021],{"class":1055,"line":1264},[1053,12004,1493],{"class":1455},[1053,12006,12007],{"class":1496}," get_cache_key",[1053,12009,1463],{"class":1113},[1053,12011,1503],{"class":1502},[1053,12013,1506],{"class":1113},[1053,12015,1510],{"class":1509},[1053,12017,1506],{"class":1113},[1053,12019,12020],{"class":1509}," view",[1053,12022,1470],{"class":1113},[1053,12024,12025],{"class":1055,"line":1298},[1053,12026,12027],{"class":1059},"        # Use service token for identification\n",[1053,12029,12030,12033,12035,12037,12039,12042,12044,12046,12048,12050,12053,12055],{"class":1055,"line":1303},[1053,12031,12032],{"class":1074},"        service_token ",[1053,12034,1530],{"class":1113},[1053,12036,1510],{"class":1074},[1053,12038,1422],{"class":1113},[1053,12040,12041],{"class":1632},"META",[1053,12043,1422],{"class":1113},[1053,12045,4121],{"class":1538},[1053,12047,1463],{"class":1113},[1053,12049,1649],{"class":1648},[1053,12051,12052],{"class":1652},"HTTP_X_SERVICE_TOKEN",[1053,12054,1649],{"class":1648},[1053,12056,1558],{"class":1113},[1053,12058,12059,12061,12064],{"class":1055,"line":1309},[1053,12060,1563],{"class":1402},[1053,12062,12063],{"class":1074}," service_token",[1053,12065,1775],{"class":1113},[1053,12067,12068,12070,12072,12075,12077,12080,12082],{"class":1055,"line":1330},[1053,12069,1596],{"class":1402},[1053,12071,1661],{"class":1455},[1053,12073,12074],{"class":1652},"\"throttle_service_",[1053,12076,1114],{"class":1667},[1053,12078,12079],{"class":1074},"service_token",[1053,12081,1121],{"class":1667},[1053,12083,8704],{"class":1652},[1053,12085,12086,12088,12090,12092,12095,12097,12099,12101,12103],{"class":1055,"line":1358},[1053,12087,1694],{"class":1402},[1053,12089,4077],{"class":4076},[1053,12091,4080],{"class":1113},[1053,12093,12094],{"class":1538},"get_cache_key",[1053,12096,1463],{"class":1113},[1053,12098,1550],{"class":1538},[1053,12100,1506],{"class":1113},[1053,12102,12020],{"class":1538},[1053,12104,1558],{"class":1113},[1053,12106,12107],{"class":1055,"line":1619},[1053,12108,1220],{"emptyLinePlaceholder":1219},[1053,12110,12111,12113,12116,12118,12120],{"class":1055,"line":1639},[1053,12112,1456],{"class":1455},[1053,12114,12115],{"class":1459}," BurstRateThrottle",[1053,12117,1463],{"class":1113},[1053,12119,11971],{"class":1466},[1053,12121,1470],{"class":1113},[1053,12123,12124,12126,12129],{"class":1055,"line":1685},[1053,12125,1476],{"class":1475},[1053,12127,12128],{"class":1479},"Allow burst requests with sustained rate limiting",[1053,12130,1483],{"class":1475},[1053,12132,12133,12135,12137,12139,12142],{"class":1055,"line":1691},[1053,12134,11987],{"class":1074},[1053,12136,1530],{"class":1113},[1053,12138,1884],{"class":1648},[1053,12140,12141],{"class":1652},"burst",[1053,12143,4314],{"class":1648},[1053,12145,12146],{"class":1055,"line":1725},[1053,12147,1488],{"class":1074},[1053,12149,12150,12152,12155,12157,12159,12161,12163,12165,12167],{"class":1055,"line":1730},[1053,12151,1493],{"class":1455},[1053,12153,12154],{"class":1496}," allow_request",[1053,12156,1463],{"class":1113},[1053,12158,1503],{"class":1502},[1053,12160,1506],{"class":1113},[1053,12162,1510],{"class":1509},[1053,12164,1506],{"class":1113},[1053,12166,12020],{"class":1509},[1053,12168,1470],{"class":1113},[1053,12170,12171],{"class":1055,"line":1759},[1053,12172,12173],{"class":1059},"        # Allow burst of requests, then apply sustained rate\n",[1053,12175,12176,12178,12180,12182,12184,12186,12188,12190,12192,12194],{"class":1055,"line":1769},[1053,12177,8688],{"class":1074},[1053,12179,1530],{"class":1113},[1053,12181,1533],{"class":1066},[1053,12183,1422],{"class":1113},[1053,12185,12094],{"class":1538},[1053,12187,1463],{"class":1113},[1053,12189,1550],{"class":1538},[1053,12191,1506],{"class":1113},[1053,12193,12020],{"class":1538},[1053,12195,1558],{"class":1113},[1053,12197,12198,12200,12202,12205],{"class":1055,"line":1778},[1053,12199,1563],{"class":1402},[1053,12201,4860],{"class":1070},[1053,12203,12204],{"class":1074}," cache_key",[1053,12206,1775],{"class":1113},[1053,12208,12209,12211],{"class":1055,"line":1794},[1053,12210,1596],{"class":1402},[1053,12212,12213],{"class":1753}," True\n",[1053,12215,12216],{"class":1055,"line":1814},[1053,12217,4091],{"class":1074},[1053,12219,12220,12223,12225,12227,12229,12231],{"class":1055,"line":1844},[1053,12221,12222],{"class":1074},"        now ",[1053,12224,1530],{"class":1113},[1053,12226,11534],{"class":1074},[1053,12228,1422],{"class":1113},[1053,12230,11402],{"class":1538},[1053,12232,1591],{"class":1113},[1053,12234,12235,12238,12240,12242,12244,12246,12248,12250],{"class":1055,"line":1860},[1053,12236,12237],{"class":1074},"        burst_key ",[1053,12239,1530],{"class":1113},[1053,12241,1661],{"class":1455},[1053,12243,5738],{"class":1652},[1053,12245,1114],{"class":1667},[1053,12247,8723],{"class":1074},[1053,12249,1121],{"class":1667},[1053,12251,12252],{"class":1652},"_burst\"\n",[1053,12254,12255,12258,12260,12262,12264,12266,12268,12270],{"class":1055,"line":1869},[1053,12256,12257],{"class":1074},"        sustained_key ",[1053,12259,1530],{"class":1113},[1053,12261,1661],{"class":1455},[1053,12263,5738],{"class":1652},[1053,12265,1114],{"class":1667},[1053,12267,8723],{"class":1074},[1053,12269,1121],{"class":1667},[1053,12271,12272],{"class":1652},"_sustained\"\n",[1053,12274,12275],{"class":1055,"line":1897},[1053,12276,4091],{"class":1074},[1053,12278,12279],{"class":1055,"line":1911},[1053,12280,12281],{"class":1059},"        # Check burst limit (e.g., 100 requests in 1 minute)\n",[1053,12283,12284,12287,12289,12291,12293,12295,12297,12300,12302],{"class":1055,"line":1916},[1053,12285,12286],{"class":1074},"        burst_requests ",[1053,12288,1530],{"class":1113},[1053,12290,8714],{"class":1074},[1053,12292,1422],{"class":1113},[1053,12294,4121],{"class":1538},[1053,12296,1463],{"class":1113},[1053,12298,12299],{"class":1538},"burst_key",[1053,12301,1506],{"class":1113},[1053,12303,9770],{"class":1113},[1053,12305,12306,12308,12310,12312,12315,12318,12321,12323,12326,12329,12332,12334,12336,12339,12341],{"class":1055,"line":1921},[1053,12307,12286],{"class":1074},[1053,12309,1530],{"class":1113},[1053,12311,2740],{"class":1113},[1053,12313,12314],{"class":1074},"req_time ",[1053,12316,12317],{"class":1402},"for",[1053,12319,12320],{"class":1074}," req_time ",[1053,12322,5425],{"class":1402},[1053,12324,12325],{"class":1074}," burst_requests ",[1053,12327,12328],{"class":1402},"if",[1053,12330,12331],{"class":1074}," now ",[1053,12333,5431],{"class":1070},[1053,12335,12320],{"class":1074},[1053,12337,12338],{"class":1070},"\u003C",[1053,12340,10875],{"class":3330},[1053,12342,2661],{"class":1113},[1053,12344,12345],{"class":1055,"line":1947},[1053,12346,4091],{"class":1074},[1053,12348,12349,12351,12354,12356,12359,12361,12363,12366],{"class":1055,"line":1957},[1053,12350,1563],{"class":1402},[1053,12352,12353],{"class":1117}," len",[1053,12355,1463],{"class":1113},[1053,12357,12358],{"class":1538},"burst_requests",[1053,12360,8662],{"class":1113},[1053,12362,11415],{"class":1070},[1053,12364,12365],{"class":3330}," 100",[1053,12367,1775],{"class":1113},[1053,12369,12370,12372],{"class":1055,"line":1973},[1053,12371,1596],{"class":1402},[1053,12373,12374],{"class":1753}," False\n",[1053,12376,12377],{"class":1055,"line":2005},[1053,12378,4091],{"class":1074},[1053,12380,12381],{"class":1055,"line":2018},[1053,12382,12383],{"class":1059},"        # Check sustained limit (e.g., 1000 requests per hour)\n",[1053,12385,12386,12389,12391,12393,12395,12397,12399,12402,12404],{"class":1055,"line":2030},[1053,12387,12388],{"class":1074},"        sustained_requests ",[1053,12390,1530],{"class":1113},[1053,12392,8714],{"class":1074},[1053,12394,1422],{"class":1113},[1053,12396,4121],{"class":1538},[1053,12398,1463],{"class":1113},[1053,12400,12401],{"class":1538},"sustained_key",[1053,12403,1506],{"class":1113},[1053,12405,9770],{"class":1113},[1053,12407,12408,12410,12412,12414,12416,12418,12420,12422,12425,12427,12429,12431,12433,12435,12438],{"class":1055,"line":2059},[1053,12409,12388],{"class":1074},[1053,12411,1530],{"class":1113},[1053,12413,2740],{"class":1113},[1053,12415,12314],{"class":1074},[1053,12417,12317],{"class":1402},[1053,12419,12320],{"class":1074},[1053,12421,5425],{"class":1402},[1053,12423,12424],{"class":1074}," sustained_requests ",[1053,12426,12328],{"class":1402},[1053,12428,12331],{"class":1074},[1053,12430,5431],{"class":1070},[1053,12432,12320],{"class":1074},[1053,12434,12338],{"class":1070},[1053,12436,12437],{"class":3330}," 3600",[1053,12439,2661],{"class":1113},[1053,12441,12442],{"class":1055,"line":2088},[1053,12443,4091],{"class":1074},[1053,12445,12446,12448,12450,12452,12455,12457,12459,12462],{"class":1055,"line":2093},[1053,12447,1563],{"class":1402},[1053,12449,12353],{"class":1117},[1053,12451,1463],{"class":1113},[1053,12453,12454],{"class":1538},"sustained_requests",[1053,12456,8662],{"class":1113},[1053,12458,11415],{"class":1070},[1053,12460,12461],{"class":3330}," 1000",[1053,12463,1775],{"class":1113},[1053,12465,12466,12468],{"class":1055,"line":2119},[1053,12467,1596],{"class":1402},[1053,12469,12374],{"class":1753},[1053,12471,12472],{"class":1055,"line":2129},[1053,12473,4091],{"class":1074},[1053,12475,12476],{"class":1055,"line":2144},[1053,12477,12478],{"class":1059},"        # Update counters\n",[1053,12480,12481,12484,12486,12488,12490,12492],{"class":1055,"line":2185},[1053,12482,12483],{"class":1074},"        burst_requests",[1053,12485,1422],{"class":1113},[1053,12487,10066],{"class":1538},[1053,12489,1463],{"class":1113},[1053,12491,5043],{"class":1538},[1053,12493,1558],{"class":1113},[1053,12495,12496,12499,12501,12503,12505,12507],{"class":1055,"line":2198},[1053,12497,12498],{"class":1074},"        sustained_requests",[1053,12500,1422],{"class":1113},[1053,12502,10066],{"class":1538},[1053,12504,1463],{"class":1113},[1053,12506,5043],{"class":1538},[1053,12508,1558],{"class":1113},[1053,12510,12511,12514,12516,12518,12520,12522,12524,12527,12529,12531],{"class":1055,"line":2209},[1053,12512,12513],{"class":1074},"        cache",[1053,12515,1422],{"class":1113},[1053,12517,8816],{"class":1538},[1053,12519,1463],{"class":1113},[1053,12521,12299],{"class":1538},[1053,12523,1506],{"class":1113},[1053,12525,12526],{"class":1538}," burst_requests",[1053,12528,1506],{"class":1113},[1053,12530,10875],{"class":3330},[1053,12532,1558],{"class":1113},[1053,12534,12535,12537,12539,12541,12543,12545,12547,12550,12552,12554],{"class":1055,"line":2238},[1053,12536,12513],{"class":1074},[1053,12538,1422],{"class":1113},[1053,12540,8816],{"class":1538},[1053,12542,1463],{"class":1113},[1053,12544,12401],{"class":1538},[1053,12546,1506],{"class":1113},[1053,12548,12549],{"class":1538}," sustained_requests",[1053,12551,1506],{"class":1113},[1053,12553,12437],{"class":3330},[1053,12555,1558],{"class":1113},[1053,12557,12558],{"class":1055,"line":2267},[1053,12559,4091],{"class":1074},[1053,12561,12562,12564],{"class":1055,"line":2272},[1053,12563,1694],{"class":1402},[1053,12565,12213],{"class":1753},[1053,12567,12568],{"class":1055,"line":2298},[1053,12569,1220],{"emptyLinePlaceholder":1219},[1053,12571,12572],{"class":1055,"line":2308},[1053,12573,2675],{"class":1059},[1053,12575,12576,12578,12580],{"class":1055,"line":2323},[1053,12577,2680],{"class":1066},[1053,12579,2683],{"class":1113},[1053,12581,2686],{"class":1113},[1053,12583,12584,12586,12589,12591,12593],{"class":1055,"line":2336},[1053,12585,2691],{"class":1648},[1053,12587,12588],{"class":1652},"DEFAULT_THROTTLE_CLASSES",[1053,12590,1649],{"class":1648},[1053,12592,1658],{"class":1113},[1053,12594,2598],{"class":1113},[1053,12596,12597,12600,12603,12605],{"class":1055,"line":3912},[1053,12598,12599],{"class":1648},"        '",[1053,12601,12602],{"class":1652},"rest_framework.throttling.AnonRateThrottle",[1053,12604,1649],{"class":1648},[1053,12606,1636],{"class":1113},[1053,12608,12609,12611,12614,12616],{"class":1055,"line":3925},[1053,12610,12599],{"class":1648},[1053,12612,12613],{"class":1652},"rest_framework.throttling.UserRateThrottle",[1053,12615,1649],{"class":1648},[1053,12617,1636],{"class":1113},[1053,12619,12620,12622,12625,12627],{"class":1055,"line":3935},[1053,12621,12599],{"class":1648},[1053,12623,12624],{"class":1652},"myapp.throttling.ServiceRateThrottle",[1053,12626,1649],{"class":1648},[1053,12628,1636],{"class":1113},[1053,12630,12631],{"class":1055,"line":3941},[1053,12632,12633],{"class":1113},"    ],\n",[1053,12635,12636,12638,12641,12643,12645],{"class":1055,"line":3952},[1053,12637,2691],{"class":1648},[1053,12639,12640],{"class":1652},"DEFAULT_THROTTLE_RATES",[1053,12642,1649],{"class":1648},[1053,12644,1658],{"class":1113},[1053,12646,2686],{"class":1113},[1053,12648,12649,12651,12654,12656,12658,12660,12663,12665],{"class":1055,"line":3996},[1053,12650,12599],{"class":1648},[1053,12652,12653],{"class":1652},"anon",[1053,12655,1649],{"class":1648},[1053,12657,1658],{"class":1113},[1053,12659,1884],{"class":1648},[1053,12661,12662],{"class":1652},"100/hour",[1053,12664,1649],{"class":1648},[1053,12666,1636],{"class":1113},[1053,12668,12669,12671,12673,12675,12677,12679,12682,12684],{"class":1055,"line":4030},[1053,12670,12599],{"class":1648},[1053,12672,1670],{"class":1652},[1053,12674,1649],{"class":1648},[1053,12676,1658],{"class":1113},[1053,12678,1884],{"class":1648},[1053,12680,12681],{"class":1652},"1000/hour",[1053,12683,1649],{"class":1648},[1053,12685,1636],{"class":1113},[1053,12687,12688,12690,12692,12694,12696,12698,12701,12703],{"class":1055,"line":4049},[1053,12689,12599],{"class":1648},[1053,12691,11994],{"class":1652},[1053,12693,1649],{"class":1648},[1053,12695,1658],{"class":1113},[1053,12697,1884],{"class":1648},[1053,12699,12700],{"class":1652},"10000/hour",[1053,12702,1649],{"class":1648},[1053,12704,1636],{"class":1113},[1053,12706,12707,12709,12711,12713,12715,12717,12720,12722],{"class":1055,"line":4054},[1053,12708,12599],{"class":1648},[1053,12710,12141],{"class":1652},[1053,12712,1649],{"class":1648},[1053,12714,1658],{"class":1113},[1053,12716,1884],{"class":1648},[1053,12718,12719],{"class":1652},"100/min",[1053,12721,1649],{"class":1648},[1053,12723,1636],{"class":1113},[1053,12725,12726],{"class":1055,"line":4068},[1053,12727,12728],{"class":1113},"    }\n",[1053,12730,12731],{"class":1055,"line":4088},[1053,12732,1682],{"class":1113},[1053,12734,12735],{"class":1055,"line":4094},[1053,12736,1220],{"emptyLinePlaceholder":1219},[1053,12738,12739],{"class":1055,"line":4100},[1053,12740,1397],{"class":1059},[1053,12742,12743,12745,12747,12749,12751,12753],{"class":1055,"line":4135},[1053,12744,1403],{"class":1402},[1053,12746,1419],{"class":1074},[1053,12748,1422],{"class":1113},[1053,12750,11921],{"class":1074},[1053,12752,1409],{"class":1402},[1053,12754,12755],{"class":1074}," UserRateThrottle\n",[1053,12757,12758],{"class":1055,"line":4145},[1053,12759,1220],{"emptyLinePlaceholder":1219},[1053,12761,12762,12764,12766,12768,12770],{"class":1055,"line":4161},[1053,12763,1456],{"class":1455},[1053,12765,1460],{"class":1459},[1053,12767,1463],{"class":1113},[1053,12769,1467],{"class":1466},[1053,12771,1470],{"class":1113},[1053,12773,12774,12777,12779,12781,12784,12786,12788],{"class":1055,"line":4172},[1053,12775,12776],{"class":1074},"    throttle_classes ",[1053,12778,1530],{"class":1113},[1053,12780,2740],{"class":1113},[1053,12782,12783],{"class":1074},"BurstRateThrottle",[1053,12785,1506],{"class":1113},[1053,12787,11966],{"class":1074},[1053,12789,2661],{"class":1113},[1053,12791,12792,12795,12797,12799,12801],{"class":1055,"line":4183},[1053,12793,12794],{"class":1074},"    throttle_scope ",[1053,12796,1530],{"class":1113},[1053,12798,1884],{"class":1648},[1053,12800,1670],{"class":1652},[1053,12802,4314],{"class":1648},[1053,12804,12805],{"class":1055,"line":4188},[1053,12806,1488],{"class":1074},[1053,12808,12809,12811,12814,12816,12818],{"class":1055,"line":4196},[1053,12810,1493],{"class":1455},[1053,12812,12813],{"class":1496}," get_throttles",[1053,12815,1463],{"class":1113},[1053,12817,1503],{"class":1502},[1053,12819,1470],{"class":1113},[1053,12821,12822,12824,12827],{"class":1055,"line":4201},[1053,12823,1517],{"class":1475},[1053,12825,12826],{"class":1479},"Apply different throttling based on request type",[1053,12828,1483],{"class":1475},[1053,12830,12831,12833,12835,12837,12839,12841,12843,12845,12847,12849,12851,12853,12855],{"class":1055,"line":4207},[1053,12832,1563],{"class":1402},[1053,12834,1533],{"class":1066},[1053,12836,1422],{"class":1113},[1053,12838,1550],{"class":1555},[1053,12840,1422],{"class":1113},[1053,12842,12041],{"class":1632},[1053,12844,1422],{"class":1113},[1053,12846,4121],{"class":1538},[1053,12848,1463],{"class":1113},[1053,12850,1649],{"class":1648},[1053,12852,12052],{"class":1652},[1053,12854,1649],{"class":1648},[1053,12856,1470],{"class":1113},[1053,12858,12859],{"class":1055,"line":4213},[1053,12860,12861],{"class":1059},"            # Inter-service requests get higher limits\n",[1053,12863,12864,12866,12868,12871],{"class":1055,"line":4219},[1053,12865,1596],{"class":1402},[1053,12867,2740],{"class":1113},[1053,12869,12870],{"class":1538},"ServiceRateThrottle",[1053,12872,12873],{"class":1113},"()]\n",[1053,12875,12876,12878,12880,12882,12885],{"class":1055,"line":6240},[1053,12877,1694],{"class":1402},[1053,12879,4077],{"class":4076},[1053,12881,4080],{"class":1113},[1053,12883,12884],{"class":1538},"get_throttles",[1053,12886,1591],{"class":1113},[1030,12888,12890],{"id":12889},"api-testing","API Testing",[1043,12892,12894],{"className":1045,"code":12893,"language":1047,"meta":1048,"style":1048},"# tests/test_api.py\nfrom rest_framework.test import APITestCase\nfrom rest_framework import status\nfrom django.contrib.auth import get_user_model\nfrom unittest.mock import patch, Mock\n\nUser = get_user_model()\n\nclass UserAPITestCase(APITestCase):\n    \"\"\"Test user API endpoints\"\"\"\n    \n    def setUp(self):\n        self.user = User.objects.create_user(\n            username='testuser',\n            email='test@example.com',\n            password='testpass123'\n        )\n        self.client.force_authenticate(user=self.user)\n    \n    def test_list_users(self):\n        \"\"\"Test user list endpoint\"\"\"\n        response = self.client.get('/api/v1/users/')\n        self.assertEqual(response.status_code, status.HTTP_200_OK)\n        self.assertIn('results', response.data)\n        self.assertIn('pagination', response.data)\n    \n    def test_create_user(self):\n        \"\"\"Test user creation\"\"\"\n        data = {\n            'username': 'newuser',\n            'email': 'new@example.com',\n            'password': 'newpass123',\n            'first_name': 'New',\n            'last_name': 'User'\n        }\n        response = self.client.post('/api/v1/users/', data)\n        self.assertEqual(response.status_code, status.HTTP_201_CREATED)\n        self.assertEqual(response.data['username'], 'newuser')\n    \n    def test_user_filtering(self):\n        \"\"\"Test user filtering\"\"\"\n        response = self.client.get('/api/v1/users/?is_active=true&search=test')\n        self.assertEqual(response.status_code, status.HTTP_200_OK)\n    \n    def test_dynamic_fields(self):\n        \"\"\"Test dynamic field selection\"\"\"\n        response = self.client.get('/api/v1/users/?fields=id,username,email')\n        self.assertEqual(response.status_code, status.HTTP_200_OK)\n        \n        user_data = response.data['results'][0]\n        self.assertIn('id', user_data)\n        self.assertIn('username', user_data)\n        self.assertIn('email', user_data)\n        self.assertNotIn('first_name', user_data)\n    \n    @patch('myapp.service_client.ServiceClient.get')\n    def test_inter_service_communication(self, mock_service_get):\n        \"\"\"Test inter-service API calls\"\"\"\n        # Mock service response\n        mock_service_get.return_value = {\n            'id': 1,\n            'name': 'Test Product',\n            'price': 99.99\n        }\n        \n        # Test endpoint that calls another service\n        response = self.client.post('/api/v1/orders/', {\n            'user_id': self.user.id,\n            'product_ids': [1]\n        })\n        \n        self.assertEqual(response.status_code, status.HTTP_201_CREATED)\n        mock_service_get.assert_called_once()\n    \n    def test_rate_limiting(self):\n        \"\"\"Test API rate limiting\"\"\"\n        # Make multiple requests to trigger rate limiting\n        for i in range(105):  # Exceed the limit\n            response = self.client.get('/api/v1/users/')\n            if i \u003C 100:\n                self.assertEqual(response.status_code, status.HTTP_200_OK)\n            else:\n                self.assertEqual(response.status_code, status.HTTP_429_TOO_MANY_REQUESTS)\n",[1050,12895,12896,12901,12917,12927,12945,12967,12971,12981,12985,12999,13008,13012,13025,13048,13064,13080,13094,13098,13126,13130,13143,13152,13179,13207,13234,13260,13264,13277,13286,13295,13314,13333,13352,13371,13388,13392,13422,13448,13483,13487,13500,13509,13536,13562,13566,13579,13588,13615,13641,13645,13672,13694,13716,13738,13761,13765,13783,13801,13810,13815,13829,13843,13862,13875,13879,13883,13888,13917,13939,13956,13960,13964,13990,14001,14005,14018,14027,14032,14055,14081,14093,14119,14126],{"__ignoreMap":1048},[1053,12897,12898],{"class":1055,"line":1056},[1053,12899,12900],{"class":1059},"# tests/test_api.py\n",[1053,12902,12903,12905,12907,12909,12912,12914],{"class":1055,"line":1063},[1053,12904,1403],{"class":1402},[1053,12906,1419],{"class":1074},[1053,12908,1422],{"class":1113},[1053,12910,12911],{"class":1074},"test ",[1053,12913,1409],{"class":1402},[1053,12915,12916],{"class":1074}," APITestCase\n",[1053,12918,12919,12921,12923,12925],{"class":1055,"line":1094},[1053,12920,1403],{"class":1402},[1053,12922,1406],{"class":1074},[1053,12924,1409],{"class":1402},[1053,12926,1412],{"class":1074},[1053,12928,12929,12931,12933,12935,12937,12939,12941,12943],{"class":1055,"line":1129},[1053,12930,1403],{"class":1402},[1053,12932,2376],{"class":1074},[1053,12934,1422],{"class":1113},[1053,12936,5148],{"class":1074},[1053,12938,1422],{"class":1113},[1053,12940,5153],{"class":1074},[1053,12942,1409],{"class":1402},[1053,12944,5158],{"class":1074},[1053,12946,12947,12949,12952,12954,12957,12959,12962,12964],{"class":1055,"line":1153},[1053,12948,1403],{"class":1402},[1053,12950,12951],{"class":1074}," unittest",[1053,12953,1422],{"class":1113},[1053,12955,12956],{"class":1074},"mock ",[1053,12958,1409],{"class":1402},[1053,12960,12961],{"class":1074}," patch",[1053,12963,1506],{"class":1113},[1053,12965,12966],{"class":1074}," Mock\n",[1053,12968,12969],{"class":1055,"line":1184},[1053,12970,1220],{"emptyLinePlaceholder":1219},[1053,12972,12973,12975,12977,12979],{"class":1055,"line":1216},[1053,12974,5193],{"class":1074},[1053,12976,1530],{"class":1113},[1053,12978,5198],{"class":1538},[1053,12980,1591],{"class":1113},[1053,12982,12983],{"class":1055,"line":1223},[1053,12984,1220],{"emptyLinePlaceholder":1219},[1053,12986,12987,12989,12992,12994,12997],{"class":1055,"line":1229},[1053,12988,1456],{"class":1455},[1053,12990,12991],{"class":1459}," UserAPITestCase",[1053,12993,1463],{"class":1113},[1053,12995,12996],{"class":1466},"APITestCase",[1053,12998,1470],{"class":1113},[1053,13000,13001,13003,13006],{"class":1055,"line":1264},[1053,13002,1476],{"class":1475},[1053,13004,13005],{"class":1479},"Test user API endpoints",[1053,13007,1483],{"class":1475},[1053,13009,13010],{"class":1055,"line":1298},[1053,13011,1488],{"class":1074},[1053,13013,13014,13016,13019,13021,13023],{"class":1055,"line":1303},[1053,13015,1493],{"class":1455},[1053,13017,13018],{"class":1496}," setUp",[1053,13020,1463],{"class":1113},[1053,13022,1503],{"class":1502},[1053,13024,1470],{"class":1113},[1053,13026,13027,13029,13031,13033,13035,13037,13039,13041,13043,13046],{"class":1055,"line":1309},[1053,13028,8480],{"class":1066},[1053,13030,1422],{"class":1113},[1053,13032,1670],{"class":1555},[1053,13034,2683],{"class":1113},[1053,13036,1850],{"class":1074},[1053,13038,1422],{"class":1113},[1053,13040,3876],{"class":1555},[1053,13042,1422],{"class":1113},[1053,13044,13045],{"class":1538},"create_user",[1053,13047,1602],{"class":1113},[1053,13049,13050,13053,13055,13057,13060,13062],{"class":1055,"line":1330},[1053,13051,13052],{"class":1544},"            username",[1053,13054,1530],{"class":1113},[1053,13056,1649],{"class":1648},[1053,13058,13059],{"class":1652},"testuser",[1053,13061,1649],{"class":1648},[1053,13063,1636],{"class":1113},[1053,13065,13066,13069,13071,13073,13076,13078],{"class":1055,"line":1358},[1053,13067,13068],{"class":1544},"            email",[1053,13070,1530],{"class":1113},[1053,13072,1649],{"class":1648},[1053,13074,13075],{"class":1652},"test@example.com",[1053,13077,1649],{"class":1648},[1053,13079,1636],{"class":1113},[1053,13081,13082,13085,13087,13089,13092],{"class":1055,"line":1619},[1053,13083,13084],{"class":1544},"            password",[1053,13086,1530],{"class":1113},[1053,13088,1649],{"class":1648},[1053,13090,13091],{"class":1652},"testpass123",[1053,13093,4314],{"class":1648},[1053,13095,13096],{"class":1055,"line":1639},[1053,13097,11427],{"class":1113},[1053,13099,13100,13102,13104,13107,13109,13112,13114,13116,13118,13120,13122,13124],{"class":1055,"line":1685},[1053,13101,8480],{"class":1066},[1053,13103,1422],{"class":1113},[1053,13105,13106],{"class":1555},"client",[1053,13108,1422],{"class":1113},[1053,13110,13111],{"class":1538},"force_authenticate",[1053,13113,1463],{"class":1113},[1053,13115,1670],{"class":1544},[1053,13117,1530],{"class":1113},[1053,13119,1503],{"class":1066},[1053,13121,1422],{"class":1113},[1053,13123,1670],{"class":1555},[1053,13125,1558],{"class":1113},[1053,13127,13128],{"class":1055,"line":1691},[1053,13129,1488],{"class":1074},[1053,13131,13132,13134,13137,13139,13141],{"class":1055,"line":1725},[1053,13133,1493],{"class":1455},[1053,13135,13136],{"class":1496}," test_list_users",[1053,13138,1463],{"class":1113},[1053,13140,1503],{"class":1502},[1053,13142,1470],{"class":1113},[1053,13144,13145,13147,13150],{"class":1055,"line":1730},[1053,13146,1517],{"class":1475},[1053,13148,13149],{"class":1479},"Test user list endpoint",[1053,13151,1483],{"class":1475},[1053,13153,13154,13156,13158,13160,13162,13164,13166,13168,13170,13172,13175,13177],{"class":1055,"line":1759},[1053,13155,9259],{"class":1074},[1053,13157,1530],{"class":1113},[1053,13159,1533],{"class":1066},[1053,13161,1422],{"class":1113},[1053,13163,13106],{"class":1555},[1053,13165,1422],{"class":1113},[1053,13167,4121],{"class":1538},[1053,13169,1463],{"class":1113},[1053,13171,1649],{"class":1648},[1053,13173,13174],{"class":1652},"/api/v1/users/",[1053,13176,1649],{"class":1648},[1053,13178,1558],{"class":1113},[1053,13180,13181,13183,13185,13188,13190,13193,13195,13197,13199,13201,13203,13205],{"class":1055,"line":1769},[1053,13182,8480],{"class":1066},[1053,13184,1422],{"class":1113},[1053,13186,13187],{"class":1538},"assertEqual",[1053,13189,1463],{"class":1113},[1053,13191,13192],{"class":1538},"response",[1053,13194,1422],{"class":1113},[1053,13196,9491],{"class":1555},[1053,13198,1506],{"class":1113},[1053,13200,1711],{"class":1538},[1053,13202,1422],{"class":1113},[1053,13204,1839],{"class":1632},[1053,13206,1558],{"class":1113},[1053,13208,13209,13211,13213,13216,13218,13220,13222,13224,13226,13228,13230,13232],{"class":1055,"line":1778},[1053,13210,8480],{"class":1066},[1053,13212,1422],{"class":1113},[1053,13214,13215],{"class":1538},"assertIn",[1053,13217,1463],{"class":1113},[1053,13219,1649],{"class":1648},[1053,13221,4521],{"class":1652},[1053,13223,1649],{"class":1648},[1053,13225,1506],{"class":1113},[1053,13227,9486],{"class":1538},[1053,13229,1422],{"class":1113},[1053,13231,1545],{"class":1555},[1053,13233,1558],{"class":1113},[1053,13235,13236,13238,13240,13242,13244,13246,13248,13250,13252,13254,13256,13258],{"class":1055,"line":1794},[1053,13237,8480],{"class":1066},[1053,13239,1422],{"class":1113},[1053,13241,13215],{"class":1538},[1053,13243,1463],{"class":1113},[1053,13245,1649],{"class":1648},[1053,13247,4362],{"class":1652},[1053,13249,1649],{"class":1648},[1053,13251,1506],{"class":1113},[1053,13253,9486],{"class":1538},[1053,13255,1422],{"class":1113},[1053,13257,1545],{"class":1555},[1053,13259,1558],{"class":1113},[1053,13261,13262],{"class":1055,"line":1814},[1053,13263,1488],{"class":1074},[1053,13265,13266,13268,13271,13273,13275],{"class":1055,"line":1844},[1053,13267,1493],{"class":1455},[1053,13269,13270],{"class":1496}," test_create_user",[1053,13272,1463],{"class":1113},[1053,13274,1503],{"class":1502},[1053,13276,1470],{"class":1113},[1053,13278,13279,13281,13284],{"class":1055,"line":1860},[1053,13280,1517],{"class":1475},[1053,13282,13283],{"class":1479},"Test user creation",[1053,13285,1483],{"class":1475},[1053,13287,13288,13291,13293],{"class":1055,"line":1869},[1053,13289,13290],{"class":1074},"        data ",[1053,13292,1530],{"class":1113},[1053,13294,2686],{"class":1113},[1053,13296,13297,13299,13301,13303,13305,13307,13310,13312],{"class":1055,"line":1897},[1053,13298,4359],{"class":1648},[1053,13300,3201],{"class":1652},[1053,13302,1649],{"class":1648},[1053,13304,1658],{"class":1113},[1053,13306,1884],{"class":1648},[1053,13308,13309],{"class":1652},"newuser",[1053,13311,1649],{"class":1648},[1053,13313,1636],{"class":1113},[1053,13315,13316,13318,13320,13322,13324,13326,13329,13331],{"class":1055,"line":1911},[1053,13317,4359],{"class":1648},[1053,13319,3210],{"class":1652},[1053,13321,1649],{"class":1648},[1053,13323,1658],{"class":1113},[1053,13325,1884],{"class":1648},[1053,13327,13328],{"class":1652},"new@example.com",[1053,13330,1649],{"class":1648},[1053,13332,1636],{"class":1113},[1053,13334,13335,13337,13339,13341,13343,13345,13348,13350],{"class":1055,"line":1916},[1053,13336,4359],{"class":1648},[1053,13338,7869],{"class":1652},[1053,13340,1649],{"class":1648},[1053,13342,1658],{"class":1113},[1053,13344,1884],{"class":1648},[1053,13346,13347],{"class":1652},"newpass123",[1053,13349,1649],{"class":1648},[1053,13351,1636],{"class":1113},[1053,13353,13354,13356,13358,13360,13362,13364,13367,13369],{"class":1055,"line":1921},[1053,13355,4359],{"class":1648},[1053,13357,3980],{"class":1652},[1053,13359,1649],{"class":1648},[1053,13361,1658],{"class":1113},[1053,13363,1884],{"class":1648},[1053,13365,13366],{"class":1652},"New",[1053,13368,1649],{"class":1648},[1053,13370,1636],{"class":1113},[1053,13372,13373,13375,13377,13379,13381,13383,13386],{"class":1055,"line":1947},[1053,13374,4359],{"class":1648},[1053,13376,3989],{"class":1652},[1053,13378,1649],{"class":1648},[1053,13380,1658],{"class":1113},[1053,13382,1884],{"class":1648},[1053,13384,13385],{"class":1652},"User",[1053,13387,4314],{"class":1648},[1053,13389,13390],{"class":1055,"line":1957},[1053,13391,10207],{"class":1113},[1053,13393,13394,13396,13398,13400,13402,13404,13406,13408,13410,13412,13414,13416,13418,13420],{"class":1055,"line":1973},[1053,13395,9259],{"class":1074},[1053,13397,1530],{"class":1113},[1053,13399,1533],{"class":1066},[1053,13401,1422],{"class":1113},[1053,13403,13106],{"class":1555},[1053,13405,1422],{"class":1113},[1053,13407,10447],{"class":1538},[1053,13409,1463],{"class":1113},[1053,13411,1649],{"class":1648},[1053,13413,13174],{"class":1652},[1053,13415,1649],{"class":1648},[1053,13417,1506],{"class":1113},[1053,13419,1992],{"class":1538},[1053,13421,1558],{"class":1113},[1053,13423,13424,13426,13428,13430,13432,13434,13436,13438,13440,13442,13444,13446],{"class":1055,"line":2005},[1053,13425,8480],{"class":1066},[1053,13427,1422],{"class":1113},[1053,13429,13187],{"class":1538},[1053,13431,1463],{"class":1113},[1053,13433,13192],{"class":1538},[1053,13435,1422],{"class":1113},[1053,13437,9491],{"class":1555},[1053,13439,1506],{"class":1113},[1053,13441,1711],{"class":1538},[1053,13443,1422],{"class":1113},[1053,13445,1633],{"class":1632},[1053,13447,1558],{"class":1113},[1053,13449,13450,13452,13454,13456,13458,13460,13462,13464,13466,13468,13470,13472,13475,13477,13479,13481],{"class":1055,"line":2018},[1053,13451,8480],{"class":1066},[1053,13453,1422],{"class":1113},[1053,13455,13187],{"class":1538},[1053,13457,1463],{"class":1113},[1053,13459,13192],{"class":1538},[1053,13461,1422],{"class":1113},[1053,13463,1545],{"class":1555},[1053,13465,4938],{"class":1113},[1053,13467,1649],{"class":1648},[1053,13469,3201],{"class":1652},[1053,13471,1649],{"class":1648},[1053,13473,13474],{"class":1113},"],",[1053,13476,1884],{"class":1648},[1053,13478,13309],{"class":1652},[1053,13480,1649],{"class":1648},[1053,13482,1558],{"class":1113},[1053,13484,13485],{"class":1055,"line":2030},[1053,13486,1488],{"class":1074},[1053,13488,13489,13491,13494,13496,13498],{"class":1055,"line":2059},[1053,13490,1493],{"class":1455},[1053,13492,13493],{"class":1496}," test_user_filtering",[1053,13495,1463],{"class":1113},[1053,13497,1503],{"class":1502},[1053,13499,1470],{"class":1113},[1053,13501,13502,13504,13507],{"class":1055,"line":2088},[1053,13503,1517],{"class":1475},[1053,13505,13506],{"class":1479},"Test user filtering",[1053,13508,1483],{"class":1475},[1053,13510,13511,13513,13515,13517,13519,13521,13523,13525,13527,13529,13532,13534],{"class":1055,"line":2093},[1053,13512,9259],{"class":1074},[1053,13514,1530],{"class":1113},[1053,13516,1533],{"class":1066},[1053,13518,1422],{"class":1113},[1053,13520,13106],{"class":1555},[1053,13522,1422],{"class":1113},[1053,13524,4121],{"class":1538},[1053,13526,1463],{"class":1113},[1053,13528,1649],{"class":1648},[1053,13530,13531],{"class":1652},"/api/v1/users/?is_active=true&search=test",[1053,13533,1649],{"class":1648},[1053,13535,1558],{"class":1113},[1053,13537,13538,13540,13542,13544,13546,13548,13550,13552,13554,13556,13558,13560],{"class":1055,"line":2119},[1053,13539,8480],{"class":1066},[1053,13541,1422],{"class":1113},[1053,13543,13187],{"class":1538},[1053,13545,1463],{"class":1113},[1053,13547,13192],{"class":1538},[1053,13549,1422],{"class":1113},[1053,13551,9491],{"class":1555},[1053,13553,1506],{"class":1113},[1053,13555,1711],{"class":1538},[1053,13557,1422],{"class":1113},[1053,13559,1839],{"class":1632},[1053,13561,1558],{"class":1113},[1053,13563,13564],{"class":1055,"line":2129},[1053,13565,1488],{"class":1074},[1053,13567,13568,13570,13573,13575,13577],{"class":1055,"line":2144},[1053,13569,1493],{"class":1455},[1053,13571,13572],{"class":1496}," test_dynamic_fields",[1053,13574,1463],{"class":1113},[1053,13576,1503],{"class":1502},[1053,13578,1470],{"class":1113},[1053,13580,13581,13583,13586],{"class":1055,"line":2185},[1053,13582,1517],{"class":1475},[1053,13584,13585],{"class":1479},"Test dynamic field selection",[1053,13587,1483],{"class":1475},[1053,13589,13590,13592,13594,13596,13598,13600,13602,13604,13606,13608,13611,13613],{"class":1055,"line":2198},[1053,13591,9259],{"class":1074},[1053,13593,1530],{"class":1113},[1053,13595,1533],{"class":1066},[1053,13597,1422],{"class":1113},[1053,13599,13106],{"class":1555},[1053,13601,1422],{"class":1113},[1053,13603,4121],{"class":1538},[1053,13605,1463],{"class":1113},[1053,13607,1649],{"class":1648},[1053,13609,13610],{"class":1652},"/api/v1/users/?fields=id,username,email",[1053,13612,1649],{"class":1648},[1053,13614,1558],{"class":1113},[1053,13616,13617,13619,13621,13623,13625,13627,13629,13631,13633,13635,13637,13639],{"class":1055,"line":2209},[1053,13618,8480],{"class":1066},[1053,13620,1422],{"class":1113},[1053,13622,13187],{"class":1538},[1053,13624,1463],{"class":1113},[1053,13626,13192],{"class":1538},[1053,13628,1422],{"class":1113},[1053,13630,9491],{"class":1555},[1053,13632,1506],{"class":1113},[1053,13634,1711],{"class":1538},[1053,13636,1422],{"class":1113},[1053,13638,1839],{"class":1632},[1053,13640,1558],{"class":1113},[1053,13642,13643],{"class":1055,"line":2238},[1053,13644,4091],{"class":1074},[1053,13646,13647,13649,13651,13653,13655,13657,13659,13661,13663,13665,13668,13670],{"class":1055,"line":2267},[1053,13648,9804],{"class":1074},[1053,13650,1530],{"class":1113},[1053,13652,9486],{"class":1074},[1053,13654,1422],{"class":1113},[1053,13656,1545],{"class":1555},[1053,13658,4938],{"class":1113},[1053,13660,1649],{"class":1648},[1053,13662,4521],{"class":1652},[1053,13664,1649],{"class":1648},[1053,13666,13667],{"class":1113},"][",[1053,13669,3788],{"class":3330},[1053,13671,2661],{"class":1113},[1053,13673,13674,13676,13678,13680,13682,13684,13686,13688,13690,13692],{"class":1055,"line":2272},[1053,13675,8480],{"class":1066},[1053,13677,1422],{"class":1113},[1053,13679,13215],{"class":1538},[1053,13681,1463],{"class":1113},[1053,13683,1649],{"class":1648},[1053,13685,1118],{"class":1652},[1053,13687,1649],{"class":1648},[1053,13689,1506],{"class":1113},[1053,13691,9839],{"class":1538},[1053,13693,1558],{"class":1113},[1053,13695,13696,13698,13700,13702,13704,13706,13708,13710,13712,13714],{"class":1055,"line":2298},[1053,13697,8480],{"class":1066},[1053,13699,1422],{"class":1113},[1053,13701,13215],{"class":1538},[1053,13703,1463],{"class":1113},[1053,13705,1649],{"class":1648},[1053,13707,3201],{"class":1652},[1053,13709,1649],{"class":1648},[1053,13711,1506],{"class":1113},[1053,13713,9839],{"class":1538},[1053,13715,1558],{"class":1113},[1053,13717,13718,13720,13722,13724,13726,13728,13730,13732,13734,13736],{"class":1055,"line":2308},[1053,13719,8480],{"class":1066},[1053,13721,1422],{"class":1113},[1053,13723,13215],{"class":1538},[1053,13725,1463],{"class":1113},[1053,13727,1649],{"class":1648},[1053,13729,3210],{"class":1652},[1053,13731,1649],{"class":1648},[1053,13733,1506],{"class":1113},[1053,13735,9839],{"class":1538},[1053,13737,1558],{"class":1113},[1053,13739,13740,13742,13744,13747,13749,13751,13753,13755,13757,13759],{"class":1055,"line":2323},[1053,13741,8480],{"class":1066},[1053,13743,1422],{"class":1113},[1053,13745,13746],{"class":1538},"assertNotIn",[1053,13748,1463],{"class":1113},[1053,13750,1649],{"class":1648},[1053,13752,3980],{"class":1652},[1053,13754,1649],{"class":1648},[1053,13756,1506],{"class":1113},[1053,13758,9839],{"class":1538},[1053,13760,1558],{"class":1113},[1053,13762,13763],{"class":1055,"line":2336},[1053,13764,1488],{"class":1074},[1053,13766,13767,13769,13772,13774,13776,13779,13781],{"class":1055,"line":3912},[1053,13768,7121],{"class":1113},[1053,13770,13771],{"class":1496},"patch",[1053,13773,1463],{"class":1113},[1053,13775,1649],{"class":1648},[1053,13777,13778],{"class":1652},"myapp.service_client.ServiceClient.get",[1053,13780,1649],{"class":1648},[1053,13782,1558],{"class":1113},[1053,13784,13785,13787,13790,13792,13794,13796,13799],{"class":1055,"line":3925},[1053,13786,1493],{"class":1455},[1053,13788,13789],{"class":1496}," test_inter_service_communication",[1053,13791,1463],{"class":1113},[1053,13793,1503],{"class":1502},[1053,13795,1506],{"class":1113},[1053,13797,13798],{"class":1509}," mock_service_get",[1053,13800,1470],{"class":1113},[1053,13802,13803,13805,13808],{"class":1055,"line":3935},[1053,13804,1517],{"class":1475},[1053,13806,13807],{"class":1479},"Test inter-service API calls",[1053,13809,1483],{"class":1475},[1053,13811,13812],{"class":1055,"line":3941},[1053,13813,13814],{"class":1059},"        # Mock service response\n",[1053,13816,13817,13820,13822,13825,13827],{"class":1055,"line":3952},[1053,13818,13819],{"class":1074},"        mock_service_get",[1053,13821,1422],{"class":1113},[1053,13823,13824],{"class":1555},"return_value",[1053,13826,2683],{"class":1113},[1053,13828,2686],{"class":1113},[1053,13830,13831,13833,13835,13837,13839,13841],{"class":1055,"line":3996},[1053,13832,4359],{"class":1648},[1053,13834,1118],{"class":1652},[1053,13836,1649],{"class":1648},[1053,13838,1658],{"class":1113},[1053,13840,10492],{"class":3330},[1053,13842,1636],{"class":1113},[1053,13844,13845,13847,13849,13851,13853,13855,13858,13860],{"class":1055,"line":4030},[1053,13846,4359],{"class":1648},[1053,13848,3691],{"class":1652},[1053,13850,1649],{"class":1648},[1053,13852,1658],{"class":1113},[1053,13854,1884],{"class":1648},[1053,13856,13857],{"class":1652},"Test Product",[1053,13859,1649],{"class":1648},[1053,13861,1636],{"class":1113},[1053,13863,13864,13866,13868,13870,13872],{"class":1055,"line":4049},[1053,13865,4359],{"class":1648},[1053,13867,3575],{"class":1652},[1053,13869,1649],{"class":1648},[1053,13871,1658],{"class":1113},[1053,13873,13874],{"class":3330}," 99.99\n",[1053,13876,13877],{"class":1055,"line":4054},[1053,13878,10207],{"class":1113},[1053,13880,13881],{"class":1055,"line":4068},[1053,13882,4091],{"class":1074},[1053,13884,13885],{"class":1055,"line":4088},[1053,13886,13887],{"class":1059},"        # Test endpoint that calls another service\n",[1053,13889,13890,13892,13894,13896,13898,13900,13902,13904,13906,13908,13911,13913,13915],{"class":1055,"line":4094},[1053,13891,9259],{"class":1074},[1053,13893,1530],{"class":1113},[1053,13895,1533],{"class":1066},[1053,13897,1422],{"class":1113},[1053,13899,13106],{"class":1555},[1053,13901,1422],{"class":1113},[1053,13903,10447],{"class":1538},[1053,13905,1463],{"class":1113},[1053,13907,1649],{"class":1648},[1053,13909,13910],{"class":1652},"/api/v1/orders/",[1053,13912,1649],{"class":1648},[1053,13914,1506],{"class":1113},[1053,13916,2686],{"class":1113},[1053,13918,13919,13921,13923,13925,13927,13929,13931,13933,13935,13937],{"class":1055,"line":4100},[1053,13920,4359],{"class":1648},[1053,13922,9735],{"class":1652},[1053,13924,1649],{"class":1648},[1053,13926,1658],{"class":1113},[1053,13928,1533],{"class":1066},[1053,13930,1422],{"class":1113},[1053,13932,1670],{"class":1555},[1053,13934,1422],{"class":1113},[1053,13936,1118],{"class":1555},[1053,13938,1636],{"class":1113},[1053,13940,13941,13943,13945,13947,13949,13951,13954],{"class":1055,"line":4135},[1053,13942,4359],{"class":1648},[1053,13944,9763],{"class":1652},[1053,13946,1649],{"class":1648},[1053,13948,1658],{"class":1113},[1053,13950,2740],{"class":1113},[1053,13952,13953],{"class":3330},"1",[1053,13955,2661],{"class":1113},[1053,13957,13958],{"class":1055,"line":4145},[1053,13959,4533],{"class":1113},[1053,13961,13962],{"class":1055,"line":4161},[1053,13963,4091],{"class":1074},[1053,13965,13966,13968,13970,13972,13974,13976,13978,13980,13982,13984,13986,13988],{"class":1055,"line":4172},[1053,13967,8480],{"class":1066},[1053,13969,1422],{"class":1113},[1053,13971,13187],{"class":1538},[1053,13973,1463],{"class":1113},[1053,13975,13192],{"class":1538},[1053,13977,1422],{"class":1113},[1053,13979,9491],{"class":1555},[1053,13981,1506],{"class":1113},[1053,13983,1711],{"class":1538},[1053,13985,1422],{"class":1113},[1053,13987,1633],{"class":1632},[1053,13989,1558],{"class":1113},[1053,13991,13992,13994,13996,13999],{"class":1055,"line":4183},[1053,13993,13819],{"class":1074},[1053,13995,1422],{"class":1113},[1053,13997,13998],{"class":1538},"assert_called_once",[1053,14000,1591],{"class":1113},[1053,14002,14003],{"class":1055,"line":4188},[1053,14004,1488],{"class":1074},[1053,14006,14007,14009,14012,14014,14016],{"class":1055,"line":4196},[1053,14008,1493],{"class":1455},[1053,14010,14011],{"class":1496}," test_rate_limiting",[1053,14013,1463],{"class":1113},[1053,14015,1503],{"class":1502},[1053,14017,1470],{"class":1113},[1053,14019,14020,14022,14025],{"class":1055,"line":4201},[1053,14021,1517],{"class":1475},[1053,14023,14024],{"class":1479},"Test API rate limiting",[1053,14026,1483],{"class":1475},[1053,14028,14029],{"class":1055,"line":4207},[1053,14030,14031],{"class":1059},"        # Make multiple requests to trigger rate limiting\n",[1053,14033,14034,14036,14039,14041,14044,14046,14049,14052],{"class":1055,"line":4213},[1053,14035,9946],{"class":1402},[1053,14037,14038],{"class":1074}," i ",[1053,14040,5425],{"class":1402},[1053,14042,14043],{"class":1117}," range",[1053,14045,1463],{"class":1113},[1053,14047,14048],{"class":3330},"105",[1053,14050,14051],{"class":1113},"):",[1053,14053,14054],{"class":1059},"  # Exceed the limit\n",[1053,14056,14057,14059,14061,14063,14065,14067,14069,14071,14073,14075,14077,14079],{"class":1055,"line":4219},[1053,14058,4897],{"class":1074},[1053,14060,1530],{"class":1113},[1053,14062,1533],{"class":1066},[1053,14064,1422],{"class":1113},[1053,14066,13106],{"class":1555},[1053,14068,1422],{"class":1113},[1053,14070,4121],{"class":1538},[1053,14072,1463],{"class":1113},[1053,14074,1649],{"class":1648},[1053,14076,13174],{"class":1652},[1053,14078,1649],{"class":1648},[1053,14080,1558],{"class":1113},[1053,14082,14083,14085,14087,14089,14091],{"class":1055,"line":6240},[1053,14084,8802],{"class":1402},[1053,14086,14038],{"class":1074},[1053,14088,12338],{"class":1070},[1053,14090,12365],{"class":3330},[1053,14092,1775],{"class":1113},[1053,14094,14095,14097,14099,14101,14103,14105,14107,14109,14111,14113,14115,14117],{"class":1055,"line":6245},[1053,14096,5441],{"class":1066},[1053,14098,1422],{"class":1113},[1053,14100,13187],{"class":1538},[1053,14102,1463],{"class":1113},[1053,14104,13192],{"class":1538},[1053,14106,1422],{"class":1113},[1053,14108,9491],{"class":1555},[1053,14110,1506],{"class":1113},[1053,14112,1711],{"class":1538},[1053,14114,1422],{"class":1113},[1053,14116,1839],{"class":1632},[1053,14118,1558],{"class":1113},[1053,14120,14121,14124],{"class":1055,"line":6263},[1053,14122,14123],{"class":1402},"            else",[1053,14125,1775],{"class":1113},[1053,14127,14128,14130,14132,14134,14136,14138,14140,14142,14144,14146,14148,14151],{"class":1055,"line":6298},[1053,14129,5441],{"class":1066},[1053,14131,1422],{"class":1113},[1053,14133,13187],{"class":1538},[1053,14135,1463],{"class":1113},[1053,14137,13192],{"class":1538},[1053,14139,1422],{"class":1113},[1053,14141,9491],{"class":1555},[1053,14143,1506],{"class":1113},[1053,14145,1711],{"class":1538},[1053,14147,1422],{"class":1113},[1053,14149,14150],{"class":1632},"HTTP_429_TOO_MANY_REQUESTS",[1053,14152,1558],{"class":1113},[1030,14154,14156],{"id":14155},"summary","Summary",[1026,14158,14159],{},"RESTful APIs are essential for microservices communication. Key principles include:",[14161,14162,14163,14171,14177,14183,14189,14195,14201],"ul",{},[14164,14165,14166,14170],"li",{},[14167,14168,14169],"strong",{},"Resource-based design",": URLs represent resources, not actions",[14164,14172,14173,14176],{},[14167,14174,14175],{},"Proper HTTP methods",": Use appropriate methods and status codes",[14164,14178,14179,14182],{},[14167,14180,14181],{},"API versioning",": Support multiple API versions",[14164,14184,14185,14188],{},[14167,14186,14187],{},"Advanced features",": Filtering, pagination, dynamic fields",[14164,14190,14191,14194],{},[14167,14192,14193],{},"Inter-service communication",": Robust client with circuit breakers",[14164,14196,14197,14200],{},[14167,14198,14199],{},"Performance optimization",": Query optimization and caching",[14164,14202,14203,14206],{},[14167,14204,14205],{},"Comprehensive testing",": Unit and integration tests",[1026,14208,14209],{},"Well-designed APIs enable loose coupling between services while maintaining clear contracts for communication. In the next section, we'll explore orchestrating microservices with Celery and RabbitMQ.",[14211,14212,14213],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}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 pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s27EL, html code.shiki .s27EL{--shiki-light:#91B859;--shiki-default:#AB5E3F;--shiki-dark:#C4704F}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}",{"title":1048,"searchDepth":1056,"depth":1063,"links":14215},[14216,14221,14227,14232,14233],{"id":1032,"depth":1063,"text":1033,"children":14217},[14218,14219,14220],{"id":1037,"depth":1094,"text":1038},{"id":1386,"depth":1094,"text":1387},{"id":2358,"depth":1094,"text":2359},{"id":2858,"depth":1063,"text":2859,"children":14222},[14223,14224,14225,14226],{"id":2862,"depth":1094,"text":2863},{"id":4225,"depth":1094,"text":4226},{"id":5115,"depth":1094,"text":5116},{"id":7032,"depth":1094,"text":7033},{"id":8292,"depth":1063,"text":8293,"children":14228},[14229,14230,14231],{"id":8296,"depth":1094,"text":8297},{"id":10687,"depth":1094,"text":10688},{"id":11899,"depth":1094,"text":11900},{"id":12889,"depth":1063,"text":12890},{"id":14155,"depth":1063,"text":14156},"md",null,{},{"title":897,"description":1028},"_GAwW615wtb1rjUKx-pONH92yE-hf-WVPtXJwu3IqLs",[14240,14242],{"title":893,"path":894,"stem":895,"description":14241,"children":-1},"MongoDB is an excellent choice for microservices due to its flexible schema, horizontal scaling capabilities, and cloud-native features. This section explores how to integrate MongoDB with Django microservices for efficient data processing and storage.",{"title":901,"path":902,"stem":903,"description":14243,"children":-1},"Microservices architecture often requires asynchronous task processing and inter-service communication. Celery, combined with RabbitMQ as a message broker, provides a robust solution for orchestrating tasks across your Django microservices ecosystem.",1772474963382]