Django ORM Kullanımı Üzerine Temel Bilgiler
Tags: webdev, django, python, programming
Published: 2024-01-01 06:05:00

**Django Insert Data**
`1. Category.objects.create(name="education")`
`2. category = Category(name="science")`
`category.save()`

Kategori foreign key veri tabanında mevcut bir nesneye sahip olması gerekir; Category() nesnesini başlatırsanız ancak kaydetmezseniz, kitabın oluşturulması ilgili nesnenin kaydedilmemiş olması nedeniyle bir ValueError hatasına yol açacaktır.

**Django List all objects**
`qs= Category.objects.all()`
Çıktı;
<QuerySet [<Category: science>, <Category: adventure>, <Category: education>, <Category: adventure>]>
`str(query.query)`
Çıktı;
'SELECT "app1_category"."id", "app1_category"."name" FROM "app1_category"'

**Django Update Data**
Kategori listesinden ilkini seçip adını büyük harfle yazacağız:
`category = Category.objects.first()`
`category.name = "Science"`
`category.save()`
`category.refresh_from_db()`
Bazen veritabanındaki değerleri güncellemek için refresh_from_db'yi çağırmanız gerekir.

**Django Spesifik Öğeyi Seçmek**
`1. Category.objects.get(name="education")`
Aksi halde aynı isimde birden fazla nesne varsa "MultipleObjectsReturned" hatası ortaya çıkacaktır.
Bu adda bir nesne olmaması durumunda DoesNotExist oluşturulacaktır.
Sorguyla eşleşen öğelerin listesini döndürecek olan filtre işlevini kullanmanız gerekecektir.
`2.Category.objects.filter(name="education")`

**Django Veri Aramaları**
Alan aramaları, SQL WHERE yan tümcesinin içeriğini nasıl belirttiğinizdir. Bunlar, QuerySet yöntemleri filter(), include() ve get() için anahtar kelime argümanları olarak belirtilir.
Iexact: Büyük küçük harfe duyarlı olmayacak şekilde tam adı arayacaktır;
`c = Category.objects.filter(name__iexact='science')`
Icontains: Veri tabanındaki LIKE gibi sorgu araması yapar;
`c = Category.objects.filter(name__icontains='education')`

**Django VEYA Sorguları**
'd' ile başlayan VEYA 's' ile başlayan kategorileri alalım, LIKE d% türünde bir sorgu yapacak olan startwith alan aramasını kullanacağız. Yaygın yol, iki farklı sorgu kümesi oluşturmak ve '|' ile birleştirmektir:
`Category.objects.filter(name__startswith='a') | Category.objects.filter(name__startswith='s')`
Onun yerine diğer yol ise Q nesnelerini kullanmaktır, Django tanımı şöyle der: "Bir Q nesnesi (Django.db.models.Q), anahtar kelime argümanlarının bir koleksiyonunu kapsüllemek için kullanılan bir nesnedir.
`Category.objects.filter(Q(name__startswith='a') | Q(name__startswith='s'))`

**Django VE Sorguları**
'E' ile başlayan ve 'n' ile biten kategoriler alacağız,
Her koşulu filtreyle oluşturun ve & ile birleştirin:
`Category.objects.filter(name__startswith='e') & Category.objects.filter(name__endswith='n')`
Q Objelerini kullanın:
`Category.objects.filter(Q(name__startswith='e') & Q(name__endswith='n'))`
Filtre fonksiyonunun içine koşulları ekleyin:
`Category.objects.filter(name__startswith='e', name__endswith='n')`

**Django DEĞİL Sorguları**
Kimlikleri 2'den büyük olan tüm Kategorileri alalım. Hariç tutma yöntemi, koşulla eşleşmeyen sorguyu döndürür:
`Category.objects.exclude(id__lt=2)`
Diğer yöntem ise Q nesnelerini yaklaşık işareti (~) ile kullanmaktır:
`Category.objects.filter(~Q(id__lt=2))`

**Django UNION Kullanımı**
Birleşim, farklı sorgu kümelerinin sonuçlarını birleştirmek için kullanılır; birleşim farklı modellerden olduğunda alanlar ve veri türlerinin eşleşmesi gerekir.
`q1 = Book.objects.filter(available=True)`
`q2 = Book.objects.exclude(available=True)`
`q1.union(q2)`

**Django JOIN Sorguları**
Birleştirme, select_related yöntemle yapılabilir: Django bu işlevi, yabancı anahtar ilişkilerini "takip edecek" ve sorgusunu yürütürken ilgili ek nesne verilerini seçecek bir QuerySet döndürür olarak tanımlar.
`Book.objects.select_related('category')`
Başka bir yol Birleştirmenin başka bir yolu da filtre kullanmaktır: model ilişkisinin adı, ardından çift alt çizgi (__) ve ardından alanın adı gelir:
`Book.objects.filter(category__name='science')`

**Django Aggerations**
Bazen bir grup nesneyi eklememiz, saymamız veya bunlardan veri almamız gerekir. Bu, toplamalarla yapılabilir:
`from django.db.models import Avg, Max, Min, Sum, Count`
Avg: Verilen ifadenin ortalama değerini döndürür
`Category.objects.all().aggregate(Avg('id'))`
Count: Sağlanan ifadeyle ilişkili nesnelerin sayısını döndürür.
`Category.objects.count()`