در مقاله پیش رو سعی دارم ترفند هایی برای بهبود و ساده ترکردن کار با پایگاه داده ها در Django را معرفی کنم 🙂
Aggregation with Filter
تا قبل از Django 2 اگر میخواستیم مواردی شبیه به تعداد کل کاربران و تعداد کل کاربران فعال را در پایگاه داده به دست آوریم باید از عبارات شرطی (conditional expressions) استفاده می کردیم :
from django.contrib.auth.models import User
from django.db.models import (
Count,
Sum,
Case,
When,
Value,
IntegerField,
)
User.objects.aggregate(
total_users=Count('id'),
total_active_users=Sum(Case(
When(is_active=True, then=Value(1)),
default=Value(0),
output_field=IntegerField(),
)),
)
در Django 2 یک تابع فیلتر آرگومان برای Aggregate اضافه شده است که کار را ساده تر کرده است:
from django.contrib.auth.models import User
from django.db.models import Count, F
User.objects.aggregate(
total_users=Count('id'),
total_active_users=Count('id', filter=F('is_active')),
)
اگر از پایگاه داده PostgreSQL استفاده می کنید دو کوئری به شرح زیر می باشد:
SELECT
COUNT(id) AS total_users,
SUM(CASE WHEN is_active THEN 1 ELSE 0 END) AS total_active_users
FROM
auth_users;
SELECT
COUNT(id) AS total_users,
COUNT(id) FILTER (WHERE is_active) AS total_active_users
FROM
auth_users;
کوئری دوم از عبارت FILTER (WHERE …) استفاده کرده است.
در ادامه این مقاله تکمیل خواهد شد 🙂
در مورد تنظیم پایگاه داده های مختلف در دیجنگو اینجا رو ببینید.
ارسال پاسخ