ディレクトリ
データ操作DjangoORM
設定のテストスクリプト
from django.test import TestCase
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")
import django
django.setup()
データの作成
私たちは今すぐ予約、公開、著者、AuthorDetailにこの4台のモデルファイルを作成しています
メソッドを作成します
models.AuthorDetail.objects.create(phone='110', email='[email protected]')models.AuthorDetail.objects.create(phone='120', email='[email protected]')models.Author.objects.create(name='冯*内古特', age=80, author_detail_id=1)models.Author.objects.create(name='菲茨杰拉德', age=44, author_detail_id=2)models.Book.objects.create(title='了不起的盖茨比', price=28.8, book_type='文学', publish_id=2)
修正データ
私たちは、主キーフィールドを参照するにはPKで遅れているので、PK自動的に、あなたは現在のテーブルの主キーフィールドを見つけましょう
フィルタクエリ結果は対象外であるクエリセット
限りクエリセットオブジェクトが無制限に通話方式のクエリセットすることができて
RES = models.Books.objects.filter(PK = 1).filter()フィルタ()フィルタ()フィルタ()
限りクエリセットオブジェクトは、SQL文を対応する現在の内部クエリの結果を表示するために指すことができるように
res.query
道
models.Book.objects.filter(pk=2).update(price=29.8)
第二の方法(推奨されません)
# 利用对象的修改 内部其实是重头到位将数据的所有字段都重新写一遍
book_obj = models.Books.objects.get(pk=1)
book_obj.price = 28.8
book_obj.save()
フィルタとGETの違い
クエリセットを取得するフィルタリストに類似オブジェクト、あります
ゲットするには、オブジェクト自体に直接データであり、
不在の場合に
フィルタが空のフィルタ方法に直接与えられていない、推奨される
ことが推奨されない方法得る直接与えられ得ます
データを削除
- 削除を使用してクエリセットメソッド()
models.Book.objects.filter(pk=3).delete()
- オブジェクトメソッド
book_obj = models.Book.objects.get(pk=3)
book_obj.delete()
クエリデータ
13のメソッド
方法 | 効果 | 例 |
---|---|---|
すべて() | すべてのお問い合わせ | models.Book.objects.all() |
フィルタ() | フィルタ | models.Book.objects.filter(PK = 1) |
取得する() | (何も文句を言うでしょうがありません)スクリーニング | models.Book.objects.get(PK = 1) |
最初() | 最初のデータ・オブジェクトを取るクエリセット | models.Book.objects.filter(publish_id = 2)1次回() |
最終() | 最後のデータオブジェクトのクエリセットを取ります | models.Book.objects.filter(publish_id = 2).last() |
カウント() | 統計データの数 | models.Book.objects.count() |
値() | フィールドの値(辞書のセットのリスト)を取得します | models.Book.objects.values( 'タイトル'、 '価格') |
values_list() | フィールドの値(タプルのセットのリスト)を取得します | models.Book.objects.values_list( 'タイトル'、 '価格') |
ORDER_BY() | 指定されたソートフィールドに従い、 | 先行models.Book.objects.all()。ORDER_BY( '価格')表記DESCフィールド |
逆() | 逆順(すでにソートされている前提) | models.Book.objects.all()。ORDER_BY( '価格')。逆() |
除外() | 指定したフィールドの値を除外する | models.Book.objects.all()。除く(タイトル= '2081') |
()が存在します | 価値判断の結果があります | models.Book.objects.filter(PK = 1).exists() |
diistinct() | 体重へのクエリ結果 | (models.Book.objects.values( 'タイトル'、 '価格')。明確な) |
二重下線
# 查询价格大于30的书籍
res = models.Book.objects.filter(price__gt=30)
print(res)
# 查询价格小于30的书籍
res = models.Book.objects.filter(price__lt=30)
print(res)
# 查询价格大于等于30的书籍
# 对数字精确度不敏感?
res = models.Book.objects.filter(price__gte=30)
print(res)
# 查询价格小于等于30的书籍
res = models.Book.objects.filter(price__lte=30)
print(res)
# 查询价格是20或者30或者50的书籍
res = models.Book.objects.filter(price__in=[20, 30, 50])
print(res)
# 查询价格在20到50之间的书籍(顾头又顾尾)
res = models.Book.objects.filter(price__range=(20, 50))
print(res)
# 查询注册日期是2019的用户
res = models.User.objects.filter(register_time__year='2019')
print(res)
# 查询注册日期是11月份的用户
res = models.User.objects.filter(register_time__month='11')
# 模糊查询
# 查询书籍是与霍开头的书
res = models.Book.objects.filter(title__startswith='霍')
print(res)
# 查询书籍是以情结尾的书
res = models.Book.objects.filter(title__endswith='情')
print(res)
# 查询书籍中含有p字母的书
res = models.Book.objects.filter(title__contains='p') # 默认区分大小写
res = model.Book.objects.filter(title__icontains='P') # 忽略大小写
print(res)
多くのフィールドのデータを変更して再検索の欠失
増加
# 方式一
models.Book.objects.create(title='了不起的盖茨比', price=28.8, book_type='文学', publish_id=2)
# 方式二
publish_obj = models.Publish.objects.filter(pk=2).first()
models.Book.objects.create(title='了不起的盖茨比', price=28.8, book_type='文学', publish=publish_obj)
変更
# 方式一
models.Book.objects.filter(pk=2).update(publish_id=1)
# 方式二
publish_obj = models.Publish.objects.filter(pk=1).first()
models.Book.objects.filter(pk=1).update(publish=publish_obj)
[削除]
models.Publish.objects.filter(pk=1).delete() # 默认就是级联删除 级联更新
多くのフィールドのデータを変更して再検索には多くの欠失
増加
# 方式一
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.author.add(1,3) # book_obj.author已经跨到第三张表了
# 方式二
book_obj = models.Book.objects.filter(pk=2).first()
author_obj = models.Book.objects.filter(pk=1).first()
author_obj1 = models.Book.objects.filter(pk=3).first()
book_obj.author.add(author_obj, author_obj1)
Addメソッドは、第3のデータテーブルに向かって追加することができます
これはデジタル伝送をサポートすることです
追加(1、3)
また、パスをサポートするオブジェクト
追加(author_obj、author_obj1)
そして、より多くのことができます
変更
# 方式一
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.author.set([4,5])
# 方式二
book_obj = models.Book.objects.filter(pk=2).first()
author_obj = models.Book.objects.filter(pk=4).first()
author_obj1 = models.Book.objects.filter(pk=5).first()
book_obj.author.set((author_obj, author_obj1))
テーブル対多の関係にあるデータセットを変更します
どちらのパス数もオブジェクトを渡すことができます
しかし、それはブラケットが反復可能オブジェクトでなければならないことを指摘します
サポート、複数の
[削除]
# 方式一
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.author.remove(1,3) # book_obj.author已经跨到第三张表了
# 方式二
book_obj = models.Book.objects.filter(pk=2).first()
author_obj = models.Book.objects.filter(pk=1).first()
author_obj1 = models.Book.objects.filter(pk=3).first()
book_obj.author.remove(author_obj, author_obj1)
明確な
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.author.clear()
括弧内のブックに関連するすべてのレコードをクリア空のパラメータを渡す必要はありません
クロステーブルのクエリ
順方向および逆方向の問い合わせ
この表をチェックする別のテーブルからフィールドに張テーブルの関係がそうでない場合は逆、前方にあります
クロステーブルのクエリオブジェクトに基づいて、
- 本を公開する主キークエリ名である2
book_obj = models.Book.objects.filter(pk=2).first()
print(book_obj.publish.name)
- 本の著者の名前の主キーを照会4
book_obj = models.Book.objects.filter(pk=2).first()
print(book_obj.author.all().values('name'))
- 著者の検索は、ジェイソンの電話番号です
author_obj = models.Author.objects.filter().first()
print(author_obj.author_detail.phone)
ご注意ください
あなたはすべてを追加したいとき
外部キーフィールドにデータが複数ある場合は、前方のクエリをクリックし、それは)必要.ALL(あります
app01.Author.None彼らは結果を見ると、ちょうど(.ALLを追加する)ことができます
逆引き参照
- プレスのお問い合わせ南部プレス出版された書籍
publish_obj = models.Publish.objects.filter(name='南方出版社').first()
print(publish_obj.book_set.all())
- 書き込みブックに著者を検索するジェイソンです
author_obj = models.Author.objects.filter(name='jason').first()
print(author_obj.book_set.all())
- クエリ電話の名前は120の著者であります
author_detail_obj = models.AuthorDetail.objects.filter(phone='120').first()
author_detail_obj.author_set.name
二重下線クロステーブルクエリに基づいて、
- 出版社名のクエリ書籍2 PK
# 正向
res = models.Book.objects.filter(pk=2).values('publish__name')
print(res)
# 反向
res = models.Publish.objects.filter(book__pk=2).values('name')
print(res)
- クエリは、著者名と電子メールPK 2を予約します
# 正向
res = models.Book.objects.filter(pk=2).values('author__name', 'author__email')
print(res)
# 反向
res = models.Author.objects.filter(book__pk=2).values('name', 'email')
print(res)
- 著者を検索するには、エゴンホームアドレスであります
# 正向
res = models.Author.objects.filter(name='egon').values('author_detail__addr')
print(res)
# 反向
res = models.AuthorDetail.filter(author__name='egon').values('addr')
print(res)
- クエリは家出版した本を出版東洋プレスの名前です。
# 反向
res = models.Publish.objects.filter(name='东方出版社').values('book__title')
print(res)
# 正向
res = models.Book.objects.filter(publish__name='东方出版社').values('title')
print(res)
- クエリは2冊PK電話番号の著者であります
# 正向
res = models.Book.objects.filter(pk=2).values('author__author_detail__phone')
print(res)
# 反向
res = models.Author.objects.filter(book__pk=2).values('author_detail__phone')
print(res)
res = models.AuthorDetail.objects.filter(author__book__pk=2).values('phone')
print(res)