ترفندهای کار با پایگاه داده ها در Django

در مقاله پیش رو سعی دارم ترفند هایی برای بهبود و ساده ترکردن کار با پایگاه داده ها در 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 …) استفاده کرده است.

در ادامه این مقاله تکمیل خواهد شد 🙂

در مورد تنظیم پایگاه داده های مختلف در دیجنگو اینجا رو ببینید.