あなたが既にSQLを知っているならば


別のMVCフレームワークからdjangoに移行している場合は、既にSQLを知っている可能性があります.
このポストでは、私はDJango ORMを使用する方法を説明します.あなたの既存の知識に新しいトピックを接続すると、ORMを高速を使用することを学ぶのに役立ちます.
属性名,年齢,性別を持つ人のための簡単な基底モデルを考察した.

上記のエンティティを実装するには、SQLでテーブルとしてモデル化します.
CREATE TABLE Person (
    id int,
    name varchar(50),
    age int NOT NULL,
    gender varchar(10),
);
同じ表をベースモデルクラスから継承するクラスとしてDjangoでモデル化します.ORMは、フードの下に同等のテーブルを作成します.
class Person(models.Model):
    name = models.CharField(max_length=50, blank=True)
    age = models.IntegerField()
    gender = models.CharField(max_length=10, blank=True)
使用されるデータ型は以下の通りです.
SQL
ジャンゴINTIntegerField()VARCHAR(n)CharField(max_length=n)TEXTTextField()FLOAT(n)FloatField()DATEDateField()TIMETimeField()DATETIMEDateTimeField()使用できる様々なクエリは以下の通りです.

SELECT文


すべての行を取得する
SQL
SELECT *
FROM Person;
ジャンゴ
persons = Person.objects.all()
for person in persons:
    print(person.name)
    print(person.gender)
    print(person.age)
特定のカラムを取得する
SQL
SELECT name, age
FROM Person;
ジャンゴ
Person.objects.only('name', 'age')
行の取得
SQL
SELECT DISTINCT name, age
FROM Person;
ジャンゴ
Person.objects.values('name', 'age').distinct()
指定した行数を取得する
SQL
SELECT *
FROM Person
LIMIT 10;
ジャンゴ
Person.objects.all()[:10]
制限とオフセットキーワード
SQL
SELECT *
FROM Person
OFFSET 5
LIMIT 5;
ジャンゴ
Person.objects.all()[5:10]

Where条項


単一カラムでフィルタ
SQL
SELECT *
FROM Person
WHERE id = 1;
ジャンゴ
Person.objects.filter(id=1)
比較演算子によるフィルタ
SQL
WHERE age > 18;
WHERE age >= 18;
WHERE age < 18;
WHERE age <= 18;
WHERE age != 18;
ジャンゴ
Person.objects.filter(age__gt=18)
Person.objects.filter(age__gte=18)
Person.objects.filter(age__lt=18)
Person.objects.filter(age__lte=18)
Person.objects.exclude(age=18)
間節
SQL
SELECT *
FROM Person 
WHERE age BETWEEN 10 AND 20;
ジャンゴ
Person.objects.filter(age__range=(10, 20))
ライク演算子
SQL
WHERE name like '%A%';
WHERE name like binary '%A%';
WHERE name like 'A%';
WHERE name like binary 'A%';
WHERE name like '%A';
WHERE name like binary '%A';
ジャンゴ
Person.objects.filter(name__icontains='A')
Person.objects.filter(name__contains='A')
Person.objects.filter(name__istartswith='A')
Person.objects.filter(name__startswith='A')
Person.objects.filter(name__iendswith='A')
Person.objects.filter(name__endswith='A')
演算子
SQL
WHERE id in (1, 2);
ジャンゴ
Person.objects.filter(id__in=[1, 2])

とOR演算子


SQL
WHERE gender='male' AND age > 25;
ジャンゴ
Person.objects.filter(gender='male', age__gt=25)
SQL
WHERE gender='male' OR age > 25;
ジャンゴ
from django.db.models import Q
Person.objects.filter(Q(gender='male') | Q(age__gt=25))
SQL
WHERE NOT gender='male';
ジャンゴ
Person.objects.exclude(gender='male')


SQL
WHERE age is NULL;
WHERE age is NOT NULL;
ジャンゴ
Person.objects.filter(age__isnull=True)
Person.objects.filter(age__isnull=False)

# Alternate approach
Person.objects.filter(age=None)
Person.objects.exclude(age=None)

キーワード順


昇順
SQL
SELECT *
FROM Person
order by age;
ジャンゴ
Person.objects.order_by('age')
降順
SQL
SELECT *
FROM Person
ORDER BY age DESC;
ジャンゴ
Person.objects.order_by('-age')

文に挿入する


SQL
INSERT INTO Person
VALUES ('Jack', '23', 'male');
ジャンゴ
Person.objects.create(name='jack', age=23, gender='male)

更新文


更新シングル行
SQL
UPDATE Person
SET age = 20
WHERE id = 1;
ジャンゴ
person = Person.objects.get(id=1)
person.age = 20
person.save()
更新複数行
SQL
UPDATE Person
SET age = age * 1.5;
ジャンゴ
from django.db.models import F

Person.objects.update(age=F('age')*1.5)

文削除


全て削除
SQL
DELETE FROM Person;
ジャンゴ
Person.objects.all().delete()
特定の行を削除
SQL
DELETE FROM Person
WHERE age < 10;
ジャンゴ
Person.objects.filter(age__lt=10).delete()

凝集


関数
SQL
SELECT MIN(age)
FROM Person;
ジャンゴ
>>> from django.db.models import Min
>>> Person.objects.all().aggregate(Min('age'))
{'age__min': 0}
マックス関数
SQL
SELECT MAX(age)
FROM Person;
ジャンゴ
>>> from django.db.models import Max
>>> Person.objects.all().aggregate(Max('age'))
{'age__max': 100}
AVG関数
SQL
SELECT AVG(age)
FROM Person;
ジャンゴ
>>> from django.db.models import Avg
>>> Person.objects.all().aggregate(Avg('age'))
{'age__avg': 50}
和関数
SQL
SELECT SUM(age)
FROM Person;
ジャンゴ
>>> from django.db.models import Sum
>>> Person.objects.all().aggregate(Sum('age'))
{'age__sum': 5050}
カウント機能
SQL
SELECT COUNT(*)
FROM Person;
ジャンゴ
Person.objects.count()

グループバイステートメント


性別によるカウント
SQL
SELECT gender, COUNT(*) as count
FROM Person
GROUP BY gender;
ジャンゴ
Person.objects.values('gender').annotate(count=Count('gender'))

保有条項


人の数が1より大きいならば、男女によるカウント
SQL
SELECT gender, COUNT('gender') as count
FROM Person
GROUP BY gender
HAVING count > 1;
ジャンゴ
Person.objects.annotate(count=Count('gender'))
.values('gender', 'count')
.filter(count__gt=1)

接合


書籍と出版社の間の外部キー関係を考えてください.
class Publisher(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
本の出版社名を取得する
SQL
SELECT name
FROM Book
LEFT JOIN Publisher
ON Book.publisher_id = Publisher.id
WHERE Book.id=1;
ジャンゴ
book = Book.objects.select_related('publisher').get(id=1)
book.publisher.name
特定の出版社を持つ本をフェッチする
SQL
SELECT *
FROM Book
WHERE Book.publisher_id = 1;
ジャンゴ
publisher = Publisher.objects.prefetch_related('book_set').get(id=1)
books = publisher.book_set.all()

接続


あなたがこのブログ記事を楽しんだならば、私が毎週新しいブログ記事を共有するところで、私と連絡をとってください.