Devobin
48 subscribers
22 photos
3 videos
13 links
Download Telegram
Channel created
#Devocook

⚛️ Atomic Operations در جنگو: وقتی `save()` نجات نمی‌دهد

🧠 قسمت 1: مشکل کجاست؟
با view_count = 10 و دو کاربر همزمان:
product = Product.objects.get(id=1)
product.view_count += 1
product.save()

نتیجه: 11 (باید 12 باشد). Race Condition در محیط همزمان حتمی است.

⚛️ قسمت 2: راه حل اتمیک
استفاده از F expressions:
from django.db.models import F
Product.objects.filter(id=1).update(view_count=F('view_count') + 1)

این کار اتمیک و بدون تداخل است.

🧩 قسمت 3: مثال‌ها
# افزایش موجودی
Product.objects.filter(id=1).update(stock=F('stock') + 5)
# انتقال موجودی
Order.objects.filter(id=1).update(total_price=F('sub_total') + F('tax'))
# شرط مقایسه
Product.objects.filter(stock__gt=F('min_threshold'))


⚠️ قسمت 4: تله مهم – ترکیب با `save()`
#  اشتباه
product.view_count = F('view_count') + 1
product.save() # F آبجکت ذخیره می‌شود، نه مقدار

راه درست:
product.view_count = F('view_count') + 1
product.save(update_fields=['view_count'])
product.refresh_from_db()



❤️ @devobin
2👍1