💡Django tip Fix Race Conditions in Django: #python #django #sql #api Every high-traffic store, ticketing platform, or booking system has this silent killer: two users hit "Buy" at the same millisecond, both see stock = 1, both complete — now you've sold something you don't have. select_for_update() locks the row at the database level so only one transaction wins. Important notes on the code 1 nowait=True — fails immediately under contention instead of silently queuing, giving the API a fast, explicit error response 2 save(update_fields=['stock']) — writes only the changed column, not the entire row 3 Custom exceptions (OutOfStockError, InsufficientQuantityError) — clean separation between "no stock at all" vs "not enough stock" 4 Logic extracted into a services.py layer — keeps views thin and the purchase logic fully testable in isolation OutOfStockError Triggered when stock == 0 — the product has absolutely nothing left. No amount of reducing quantity will help. InsufficientQuantityError Triggered when stock > 0 but less than what the user requested — there's some stock, just not enough for this order. #tip #tips #tipoftheday
Fix Django Race Conditions with select_for_update()
More Relevant Posts
-
This one Django mistake made my query 12 seconds slow, and I realize it for hours.... 12 seconds… for a simple page. At first, I thought: “Maybe my system is slow.” But the real problem was my query. Here’s what was wrong 👇 I was doing this: • Fetching all records • Looping in Python to filter data • Multiple DB hits inside a loop Basically… I made Django work harder than needed. Here’s what fixed it: ✅ Used `select_related()` to reduce joins ✅ Used `prefetch_related()` for reverse relations ✅ Moved filtering logic into the database ✅ Avoided unnecessary loops Result? ⚡ Query time dropped from 12 sec → under 1 sec Big lesson: If your Django app feels slow, don’t blame Django… Check how you’re querying the database. Most of the time, the problem is not the framework — it’s the query. Have you ever faced slow queries in Django? What was your fix? #django #backend #python #query #developer
To view or add a comment, sign in
-
-
Day-122 📘 Python Full Stack Journey – Django Admin Customization & Form Feedback Today I explored how to enhance data presentation in Django Admin and improve user experience after form submission. 🚀 🎯 What I learned today: 📊 Admin Panel – Data Table View Customized Django Admin using ModelAdmin Displayed specific fields in a table format using: class ContactAdmin(admin.ModelAdmin): list_display = ('user_name', 'email_id', 'phone_number') This made the admin panel more structured and easier to manage data 💬 Popup / Response Page After Form Submission Created a popup (response) page to show feedback after form submission Updated views.py to: Validate and save form data Redirect or render a success page after submission if form.is_valid(): form.save() return render(request, 'popup.html') 💡 This improves user experience by confirming that the form was successfully submitted. This session helped me understand how to make applications more user-friendly and organized, both on the admin side and user-facing side. Step by step, building more complete Django applications! 💻✨ #Django #Python #FullStackDevelopment #WebDevelopment #Backend #AdminPanel #Forms #UIUX #CodingJourney #LearningToCode #Upskilling #ContinuousLearning
To view or add a comment, sign in
-
-
Day-123 📘 Python Full Stack Journey – Django CRUD (Create Operation) Today I started implementing CRUD operations in Django, beginning with the Create functionality by building an Employee Registration Form. 🚀 🎯 What I learned today: 🗄️ Model Creation Created an Employee model to store user data: Full Name Employee ID Phone Number Email ID 🌐 Form Creation (Manual HTML Form) Built a registration form using HTML Used: method="post" {% csrf_token %} for security Input validation with required attributes ⚙️ Handling Form Data in Views Captured user input using request.POST Created an object and saved data into the database: ob = Employee() ob.fullname = username ob.emp_id = empid ob.ph_no = phno ob.email_id = emailid ob.save() 🔗 Routing & Navigation Connected form via URL routing Added navigation link in base.html This session helped me understand how Django handles data creation from user input, a key part of real-world applications. Looking forward to implementing the remaining CRUD operations — Read, Update, and Delete! 💻✨ #Django #Python #FullStackDevelopment #WebDevelopment #CRUD #BackendDevelopment #CodingJourney #LearningToCode #Upskilling #ContinuousLearning
To view or add a comment, sign in
-
-
Optimizing Django Queries: How to Avoid N+1 Problems One of the quickest ways to slow down your Django backend is the classic N+1 query issue. While working on Inboxit, I had to be deliberate about this especially when dealing with relationships between models. The fix I use most often: prefetch_related() It’s perfect for optimizing reverse relationships (when you have a ForeignKey pointing to your model and you need to access related data). Instead of making one query per object (which explodes with more records), prefetch_related fetches all the related data in just two queries one for the main objects and one for the related ones. This small change keeps response times fast and your API scalable as usage grows. Have you run into N+1 issues in your Django projects? What’s your go-to optimization technique? #Django #DRF #Python #BackendDevelopment #QueryOptimization #TechNigeria #webdev
To view or add a comment, sign in
-
-
One serializer change turned my API from 1.8s to 200ms. ⚡ Everything was working fine. But something felt off. The API was slow… for no obvious reason. The issue wasn’t the database. It wasn’t Django. It was the serializer. What was happening: I was returning way more data than needed. Nested serializers Unnecessary fields Hidden queries All adding up silently. The fixes: 🔹 Use .only() to fetch required fields 🔹 Use .values() for lightweight responses 🔹 Avoid deep nested serializers unless necessary 🔹 Write custom serializers where control matters The realization: APIs don’t slow down suddenly. They get heavier with every extra field you return. The rule: Return only what the client needs. Nothing more. You don’t need all fields. You just never questioned it. What’s one performance mistake you’ve caught in your API? #SoftwareEngineering #BackendDevelopment #Django #Python #APIDesign #Performance #WebDevelopment #RESTAPI #Developers
To view or add a comment, sign in
-
-
Day-120,121 📘 Python Full Stack Journey – Django Forms & User Input Handling Today I learned how to handle user input in Django using models and forms — an important step toward building interactive and data-driven applications. 🚀 🎯 What I learned today: 🗄️ Model Creation (Contact Form) Created a Contact model to store user data: Name Email Phone number Applied migrations and registered the model in Django Admin for easy data management 📝 Django ModelForm Created a form using Django’s built-in ModelForm: class BookingContact(forms.ModelForm): class Meta: model = Contact fields = '__all__' Learned how Django automatically generates form fields from models 🌐 Displaying Forms in Templates Rendered forms in HTML using: {{ form }} {{ form.as_p }} for structured layout 📩 Form Submission (POST Method) Used POST method for secure data submission Added {% csrf_token %} for protection Handled form submission in views.py: if request.method == 'POST': form = BookingContact(request.POST) if form.is_valid(): form.save() 🎨 Custom Form Styling Styled individual form fields manually using labels and inputs Learned how to design forms for better user experience This session helped me understand how Django manages forms, validation, and database storage seamlessly — a key step in building real-world web applications. Excited to keep building more interactive features! 💻✨ #Django #Python #FullStackDevelopment #WebDevelopment #Backend #Forms #Database #CodingJourney #LearningToCode #Upskilling #ContinuousLearning
To view or add a comment, sign in
-
-
Day-117 📘 Python Full Stack Journey – Django Models to UI Rendering Today I worked on a complete flow in Django — from creating database models to displaying dynamic data on a webpage. This felt like a true full-stack experience! 🚀 🎯 What I learned today: 🗄️ Model Creation (Database Table) Defined a model in models.py: class Course(models.Model): course_name = models.CharField() course_description = models.TextField() Learned: CharField → for small text data TextField → for larger content Understood that inheriting from models.Model creates a database table 🔄 Migrations & Admin Integration Applied database changes using: py manage.py makemigrations py manage.py migrate Registered model in admin.py: admin.site.register(Course) Managed data through Django Admin (add, edit, delete) 💡 Also learned that missing migrations can cause errors like “no such table” 🌐 Fetching & Displaying Data Retrieved data in views.py: details = { 'data': Course.objects.all() } Passed data to template and displayed using loop: {% for i in data %} <h1>{{i.course_name}}</h1> <p>{{i.course_description}}</p> {% endfor %} 🎨 Styling & Layout Used Flexbox/Grid to design responsive course cards Created a clean UI layout for displaying multiple records dynamically This session helped me understand how Django connects database → backend → frontend, making applications truly dynamic and data-driven. Excited to build more real-world features using Django! 💻✨ #Django #Python #FullStackDevelopment #WebDevelopment #Backend #Frontend #Database #CodingJourney #LearningToCode #Upskilling #ContinuousLearning
To view or add a comment, sign in
-
-
Day-129 📘 Python Full Stack Journey – Django Messages & Authentication Flow 🔐 Today I enhanced my Django application by implementing user feedback messages and complete authentication flow (Login & Logout). 🚀 🎯 What I learned today: 💬 Django Messages Framework Displayed success messages after signup using: messages.success(request, f'Account created for {username}!') Rendered messages in HTML using: {% if messages %} {% for message in messages %} <p style="color: green;">{{ message }}</p> {% endfor %} {% endif %} 💡 This improves user experience by giving instant feedback. 🔐 Login Using AuthenticationForm Used Django’s built-in AuthenticationForm Accessed form fields directly in template: {{ form.username }} {{ form.password }} Validated and authenticated users securely 🚪 Logout Functionality Implemented logout using: from django.contrib.auth import logout def logout_view(request): logout(request) return redirect('Login') Added logout route and link in UI ⚙️ Key Takeaways Improved user interaction with messages Built a complete authentication cycle (Signup → Login → Logout) Learned how Django handles sessions and user state This session made my application more user-friendly, secure, and complete. Excited to keep improving with protected routes and user-specific data next! 💻✨ #Django #Python #FullStackDevelopment #WebDevelopment #Authentication #Login #Logout #UserExperience #CodingJourney #LearningToCode #Upskilling #ContinuousLearning
To view or add a comment, sign in
-
-
Day 02 of 30 | Django MVT Pattern 🐍 Before writing any code in Django, you need to understand how it thinks. MVT = Model + View + Template. Every request your user makes follows this exact flow: → Browser sends a request → urls.py routes it to the right View → View asks the Model for data → Model queries the database → View sends data to the Template → Template renders HTML and returns it to the browser I made a video explaining each part. My English is A2. The diagram helps. 👀 #Django #Python #30DaysOfDjango #LearningInPublic #Developer #SaaS
To view or add a comment, sign in
-
Understanding Django's .get_or_create() Pattern A pattern I see frequently misunderstood in Django codebases: This returns a tuple of (instance, boolean). The comma performs standard Python iterable unpacking—it's not Django-specific syntax. Common mistake: Treating the unpacked variables as a single unit. They're independent references. obj is a fully editable model instance, and created is simply a boolean indicating whether a new record was inserted. Practical application—handling placeholder records: Consider a ProjectMembership model where new clients are created with project=None as a placeholder. This pattern: Finds the existing placeholder if present Creates one if absent Updates the project reference in either case Result: The placeholder is upgraded rather than orphaned. No duplicate records. No cleanup required. Key takeaway: .get_or_create() followed by assignment provides atomic-like "get or upsert" semantics without race conditions that plague separate get-then-create logic. This protection only works if there's a database-level unique constraint on the lookup fields (or Django's unique_together in Meta). Without it, .get_or_create() still has a race condition window. The database constraint is what guarantees atomicity. #Django #Python #BackendEngineering #SoftwareDevelopment
To view or add a comment, sign in
-
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development
Great separate of Concerns and nice handling exception🔥 Thanks for sharing 🙏🏻