あなたが既にSQLを知っているならば
別のMVCフレームワークからdjangoに移行している場合は、既にSQLを知っている可能性があります.
このポストでは、私はDJango ORMを使用する方法を説明します.あなたの既存の知識に新しいトピックを接続すると、ORMを高速を使用することを学ぶのに役立ちます.
属性名,年齢,性別を持つ人のための簡単な基底モデルを考察した.
上記のエンティティを実装するには、SQLでテーブルとしてモデル化します.
SQL
ジャンゴ
すべての行を取得する
SQL
SQL
SQL
SQL
SQL
単一カラムでフィルタ
SQL
SQL
SQL
SQL
SQL
SQL
SQL
昇順
SQL
SQL
SQL
更新シングル行
SQL
SQL
全て削除
SQL
SQL
関数
SQL
SQL
SQL
SQL
SQL
性別によるカウント
SQL
人の数が1より大きいならば、男女によるカウント
SQL
書籍と出版社の間の外部キー関係を考えてください.
SQL
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
ジャンゴ
INT
IntegerField()
VARCHAR(n)
CharField(max_length=n)
TEXT
TextField()
FLOAT(n)
FloatField()
DATE
DateField()
TIME
TimeField()
DATETIME
DateTimeField()
使用できる様々なクエリは以下の通りです.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)
SQLWHERE gender='male' OR age > 25;
ジャンゴfrom django.db.models import Q
Person.objects.filter(Q(gender='male') | Q(age__gt=25))
SQLWHERE 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()
接続
あなたがこのブログ記事を楽しんだならば、私が毎週新しいブログ記事を共有するところで、私と連絡をとってください.
Reference
この問題について(あなたが既にSQLを知っているならば), 我々は、より多くの情報をここで見つけました https://dev.to/amitness/django-orm-if-you-already-know-sql-k80テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol