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
#devocook

📍 کجا از میکروسرویس با Django استفاده کنیم؟

پروژه خیلی بزرگ شده و چند تیم روی آن کار می‌کنند
نیاز به دیپلوی و مقیاس‌دهی مستقل هر بخش دارید (مثل سرویس پرداخت)
می‌خواهید از فناوری‌های مختلف کنار Django استفاده کنید
خطای یک سرویس نباید کل سیستم را از کار بیندازد
پروژه کوچک یا متوسط است؟ مونولیت هنوز بهترین انتخاب است.

🚀 میکروسرویس با Django: از مونولیت به مقیاس‌پذیری

جنگو به تنهایی فریمورک مونولیتیک است، اما می‌تواند پایه عالی برای میکروسرویس باشد.


رویکرد درست:
هر سرویس یک پروژه Django + DRF مستقل است که:
دیتابیس خودش را دارد
با بقیه سرویس‌ها از طریق REST، gRPC یا Message Broker (RabbitMQ) ارتباط برقرار می‌کند
جداگانه دیپلوی و اسکیل می‌شود
مثال:
سرویس کاربران (Accounts)
سرویس سفارشات (Orders)
سرویس پرداخت (Payments)
ابزارهای کلیدی:
Django REST Framework
JWT برای احراز هویت
RabbitMQ / Redis برای ارتباطات ناهمگام
Docker + Kubernetes برای دیپلوی
API Gateway (Kong یا Traefik)
چالش‌های مهم:
تراکنش‌های توزیع‌شده
لاگ و نظارت متمرکز (ELK + Prometheus + Grafana)

@devobin
1
🚀 آپدیت جدید پروژه Map & Shop Management System

امروز چند قابلیت مهم و کاربردی به پروژه اضافه شد.

متأسفانه به دلیل محدودیت اینترنت نتونستم ویدئوی دمو رو آپلود کنم، اما تصاویر بخش‌های جدید پروژه رو به اشتراک گذاشتم.

تغییرات جدید:

سیستم مسیریابی ارتقا پیدا کرد و از مسیریابی ساده به پیدا کردن نزدیک‌ترین و بهینه‌ترین مسیر تغییر کرد.

هر فروشگاه اکنون می‌تواند فروشگاه آنلاین اختصاصی و کاملاً شخصی‌سازی‌شده خود را داخل پلتفرم داشته باشد.

پروژه به Web App (PWA) تبدیل شد و قابلیت نصب روی موبایل و دسکتاپ را پیدا کرد.

پنل کاربری مشتریان به‌صورت کامل پیاده‌سازی شد.

علاوه بر نمایش فروشگاه‌ها روی نقشه، امکان مشاهده آن‌ها به‌صورت لیست نیز اضافه شد.

امکان خرید همزمان از چند فروشگاه مختلف در یک فرآیند خرید فراهم شد.

لینک پست در لینکدین

https://www.linkedin.com/posts/mobin-hasanghasemi-067154384_django-python-programming-activity-7468375485329252352-gYmS?utm_source=share&utm_medium=member_desktop&rcm=ACoAAF60vE8B6N_WoAxH7cDsv2l-HMFO31av5F4


#FullStackDevelopment
#Programming
#Developer
#Devocook


سیستم تخفیف ناحیه‌ای


1- فرانت به سرور موقعیت کاربر رو میفرسته

2 -بک‌اند (بررسی داخل محدوده بودن)

مدل:
class Offer(models.Model):
polygon_data = models.JSONField() # GeoJSON مثل {"coordinates": [[lat,lng],...]}
discount = models.IntegerField()


منطق بررسی:
def is_point_in_polygon(lat, lng, polygon_coords):
# الگوریتم Ray-Casting
inside = False
n = len(polygon_coords)
for i in range(n):
x1, y1 = polygon_coords[i]
x2, y2 = polygon_coords[(i+1)%n]
if (y1 > lng) != (y2 > lng):
x_intersect = x1 + (lng - y1)*(x2 - x1)/(y2 - y1)
if x_intersect > lat:
inside = not inside
return inside


فیلتر نهایی:
def get_user_offers(user_lat, user_lng):
offers = Offer.objects.all()
result = []
for offer in offers:
coords = offer.polygon_data['coordinates'][0]
if is_point_in_polygon(user_lat, user_lng, coords):
result.append(offer)
return result
1
و به این فرمت به بک اند ارسال میشه