ORMの
表------->型
フィールド-----> [プロパティ]
モデル
フォーカス:,
- モデル構成
- データへの追加と削除
- 增:ブック=のBookInfo()book.save()和BookInfo.objects.create()
- 删:。book.delete()和BookInfo.objects.getは、()(削除)
- 変更:. Book.name = 'XXX' book.save () とBookInfo.object.get()更新(名= XXX)
3.データのクエリ - 基礎となる問合せ
- FオブジェクトとオブジェクトQ
- 関連するオブジェクト
- クエリセットクエリセット
まず、プロジェクトの準備
-
プロジェクトの作成
ジャンゴ管理者startprojectのBookManagerのを -
アプリケーション作成
のPython manager.py startappのブックを -
選択需要:Pythonインタプリタを交換
ビューのパスを:どのパイソン -
子アプリケーションの追加
INSTALLED_APPSにサブアプリケーションを追加するために -
ローカライズの
変更言語、タイムゾーン
#セット中国
LANGUAGE_CODE =「ZH-ハンス」
#上海アジアのタイムゾーン
TIME_ZONE =「アジア/上海」 -
テンプレートのパス
と同じレベルのディレクトリでのアプリケーションでは、テンプレートのテンプレートフォルダを作成する
テンプレートDIRSがあなたのテンプレートを作成し、パスに
[os.path.join(BASE_DIR、「テンプレート」 )]、 -
このプロジェクトは、URLにマッチする
正規の:限り、パス管理者として/マッチが成功した場合でも。そして、アプリケーションが含まれていurls.py
URL(R&LT '^'と、 ')book.urls'(含めます) -
urls.pyがマッチングの応用
アプリケーションが作成するのurls.py
定期:パスは、ブックリストの/が含まれていますが、ビューは、ブックリストを、対応する関数と呼ばれ
django.conf.urlsインポートURLから
book.viewsからのインポートブックリスト(
urlpatterns = [
# 匹配书籍列表信息的URL,调用对应的bookList视图
url(r'^booklist/$',bookList)
]
-
準備ビューの
カスタムビュー:図書情報のリストを提供
デフブックリスト(要求):( 'OK!')はHttpResponseを返します
10.サーバーの電源を入れ、テストプロジェクト
プロジェクトファイルに、サーバーの対応するプロジェクトを開き
Pythonはmanage.pyの RUNSERVER
表示するURLをクリックしてください
第二に、構成された
、Djangoはデフォルトの初期設定データベースのsqliteを使用してsettings.pyでデータベースの接続設定情報を保存します
1. 使用MySQL数据库首先需要安装驱动程序
pip install PyMySQL
2. 在Django的 工程 同名子目录的 __init__.py 文件中添加如下语句
import pymysql
pymysql.install_as_MySQLdb()
3. 修改DATABASES配置信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', # 数据库主机
'PORT': 3306, # 数据库端口
'USER': 'root', # 数据库用户名
'PASSWORD': 'mysql', # 数据库用户密码
'NAME': 'book' # 数据库名字
}
}
4. 在MySQL中创建数据库
create database book charset=utf8;
第三に、モデルクラスの定義
モデルクラスは、「アプリケーション/models.py」ファイルで定義されています。
Modelクラスはdjango.db.modelsパッケージに、モデルクラスから継承する必要があります。
デモンストレーションのための一例として、キャラクターの管理 - 最初の「ブックへ次。
定義1
在models.py 文件中定义模型类。
from django.db import models
# Create your models here.
# 准备书籍列表信息的模型类
class BookInfo(models.Model):
# 创建字段,字段类型...
name = models.CharField(max_length=20, verbose_name='名称')
pub_date = models.DateField(verbose_name='发布日期',null=True)
readcount = models.IntegerField(default=0, verbose_name='阅读量')
commentcount = models.IntegerField(default=0, verbose_name='评论量')
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'bookinfo' # 指明数据库表名
verbose_name = '图书' # 在admin站点中显示的名称
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.name
# 准备人物列表信息的模型类
class PeopleInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
name = models.CharField(max_length=20, verbose_name='名称')
gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'peopleinfo'
verbose_name = '人物信息'
def __str__(self):
return self.name
1)データベーステーブルの名称
モデルクラスを使用すると、データベースモデルクラスと呼ばれる小文字_小文字のテーブル名に、Djangoのデフォルトアプリのアプリケーション名をテーブル名を指定しない場合。
あなたはDB_Tableのことで、データベーステーブルの名前を指定することもできます。
2)主キーに
自動的にテーブルの成長を作成する主キー列ジャンゴ、各モデルは、1つのプライマリキー列を持つことができ
ますが、プロパティベースに設定するオプションを使用する場合Djangoはキー列の自動成長後の主キー列を作成しません。
主キー列は、IDのデフォルトのプロパティを作成している、それは主キーの代わりにPK、PKの綴りを使用することができます。
3)プロパティの命名制限が
キーワードのpythonを予約することができません。
Djangoのクエリによって決定された連続アンダースコアの使用を許可しないでください。
オプションパラメータの構文で指定したフィールドタイプ、フィールドタイプの場合は、以下のように定義された属性が指定されている:
物件タイプフィールド=モデル(オプション)
MAX_LENGTHを設定する必要がありますCharfiled
メイン管理背景表示verbose_name
4)キー
、外部キーを設定する場合、プライマリ・テーブルはon_deleteオプションでデータを削除する必要が示す
任意定数django.db.modelsを含む、どのように外部キー参照テーブルのデータ処理のための
-
マスターテーブルのデータを削除する場合CASCADEカスケードは外部キーテーブルとの間でデータ通信を削除します
-
例外をスローすることにより、保護、ProtectedErrorをPROTECT、データが外部キー主テーブルのアプリケーションを防ぐために削除されます
-
NULLに設定SET_NULLは、唯一このフィールドにnullを可能にするために使用することができます= Trueがnullの場合
-
SET_DEFAULTデフォルト値に設定すると、フィールドが使用可能なデフォルト値を持っている場合にのみ、
-
特定の値に設定()コールまたは特定の方法
-
DO_NOTHINGは何もしない、あらかじめ指定のデータベースカスケード場合、このオプションは例外をスローしますIntegrityError
2移行
データベースへの同期モデルクラス。
1)ファイルの移行が生成する
Pythonのmanage.pyの makemigrationsを
2)データベース同期するために
Pythonはmanage.pyの移行を
3データを追加します。
MySQLデータベースにデータを追加します
四、シェルツール
シェルツール
Djangoの管理ツールは、シェルコマンドを提供し、私たちは、(そのような接続データベースなど)、現在の動作環境プロジェクトを構成するのに役立ち
ますが、端末に直接テスト用のPython文を実行できるようにします。
-
シェルにコマンド
のPython manage.pyシェル -
シェルモデルクラスを入力した後、あなたはキーをインポート
例:book.modelsからのBookInfo、PeopleInfoをインポート
第五に、データベースの操作には、追加、削除、変更するには
1つの増加
データ二つの方法を増大させます。
from boook.models import BookInfo
# 方式1
# 需要手动调用 save() -----> book.save()
book = BookInfo(
name='python',
pub_data='2019-06-03'
)
book.save()
# 方式2 直接入库 create -----> 通过模型类.objects.create()保存。
# objects 模型的管理类
# 我们对模型的 增删改查 都找它
BookInfo.objects.create(
name='java',
pub_data='2010-06-06'
)
2変更
更新プログラムの変更は二つの方法があります。
from boook.models import BookInfo
# 方式1 ( 手动调用save )
# 1.先查询数据
book = BookInfo.objects.get(id=1)
# 2.直接修改实例的属性
book.readcount=20
# 3. 调用save方法
book.save()
# 方式2 直接更新 ( update )
使用模型类.objects.filter().update(),会返回受影响的行数
# filter
BookInfo.objects.filter(id=1).update(
readcount = 100,
commentcount = 200
3削除し
、2つの方法があります削除します。
# 方式1
# 1. 先查询出数据
book = BookInfo.objects.get(id=5)
# 2. 调用删除方法
book.delete()
# 方式2
模型类.objects.filter().delete()
BookInfo.objects.filter(id=6).delete()
第六に、データベースの操作 - クエリ
基本的な条件は、クエリ
基本的なクエリを
1. 查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。
2. all查询多个结果。
3. count查询结果数量。
# 返回一个数据
book = BookInfo.objects.get(id=1)
# 查询的id 不存在时会抛出异常
book = BookInfo.objects.get(id=100)
try:
book = BookInfo.objects.get(id=100)
except BookInfo.DoesNotExist:
pass
# 返回所有结果,是一个列表
BookInfo.objects.all()
# count 返回的是查询到的数量
BookInfo.objects.all().count()
BookInfo.objects.count()
2フィルタクエリ
SQLの機能を実現するために、含みます
1. filter过滤出多个结果
2. exclude排除掉符合条件剩下的结果
3. get过滤单一结果
对于过滤条件的使用,上述三个方法相同,故仅以filter进行讲解。
过滤条件的表达语法如下:
属性名称__比较运算符=值
# 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线
BookInfo ----->モデルクラス
1)相等
exact:表示判等。
例:查询编号为1的图书。
BookInfo.objects.filter(id__exact=1)
可简写为:
BookInfo.objects.filter(id=1)
--------------------------------------------------------------------------------
# 查询编号为1的图书
# exact 精确的 准确的 就是等于
BookInfo.objects.get(id_exact=1)
BookInfo.objects.get(id=1) # 相当于是第一个的简写
BookInfo.objects.filter(id=1) # 返回的是一个列表 想要获得的是一个对象利用下标的形式
# BookInfo.objects.filter(id=1)[0]
2)模糊查询
contains:是否包含。
说明:如果要包含%无需转义,直接写即可。
例:查询书名包含'传'的图书。
BookInfo.objects.filter(name__contains='传')
startswith、endswith:以指定值开头或结尾。
例:查询书名以'部'结尾的图书
BookInfo.objects.filter(name__endswith='部')
以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,
如iexact、icontains、istartswith、iendswith.
----------------------------------------------------------------------------
# 查询书名包含'湖'的图书
# contains 包含 的意思
BookInfo.objects.filter(name__contains='湖')
# 查询书名以'部'结尾的图书
# endswith 以什么结尾的意思
BookInfo.objects.filter(name__endswith='部')
3) 空查询
isnull:是否为null。
例:查询书名为空的图书。
BookInfo.objects.filter(name__isnull=True)
4) 范围查询
in:是否包含在范围内。
例:查询编号为1或3或5的图书
BookInfo.objects.filter(id__in=[1,3,5])
5)比较查询
gt大于 (greater then)
gte大于等于 (greater then equal)
lt小于 (less then)
lte小于等于 (less then equal)
例:查询编号大于3的图书
BookInfo.objects.filter(id__gt=3)
不等于的运算符,使用exclude()过滤器。
例:查询编号不等于3的图书
BookInfo.objects.filter(id__gt=3)
6)日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
例:查询1980年发表的图书。
BookInfo.objects.filter(pub_date__year=1980)
例:查询1990年1月1日后发表的图书。
BookInfo.objects.filter(pub_date__gt='1990-1-1')
- FとQのオブジェクト
F对象 ----> # 对两个属性的比较
语法:
filter (字段名__运算符=F('字段名'))
例:查询阅读量大于等于评论量的图书。
from django.db.models import F
BookInfo.objects.filter(readcount__gt=F('commentcount'))
可以在F对象上使用算数运算。
例:查询阅读量大于2倍评论量的图书。
BookInfo.objects.filter(readcount__gt=F('commentcount')*2)
Qオブジェクト
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
例:需要查询id 大于2 并且阅读量大于20的书籍
# 方式1
# filter().filter()
BookInfo.objects.filter(id__gt=2).filter(readcount__gt=20)
# 方式2
# filter(条件,条件)
BookInfo.objects.filter(id__gt=2,readcount__gt=20)
如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。
语法如下:
Q(属性名__运算符=值)
例:需要查询id大于2 或者 阅读量大于40的书籍
from django.db.models import Q
BookInfo.objects.filter(Q(id__gt=2)|Q(readcount__gt=40))
Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。
Q对象前可以使用~操作符,表示非not。
例:查询编号不等于3的图书。
BookInfo.objects.filter(~Q(id=3))
- 集約関数とランキング機能
1. 聚合函数
Sum,Max,Min,Avg,Count
聚合函数需要使用 aggregate
语法形式是:aggregate(Xxx('字段'))
# 当前书籍的阅读总量
from django.db.models import Sum,Max,Min,Avg,Count
BookInfo.objects.aggregate(Sum('readcount'))
注意aggregate的返回值是一个字典类型
{'属性名__聚合类小写':值}
如:
{'readcount__sum': 126}
使用count时一般不使用aggregate()过滤器。
例:查询图书总数。
BookInfo.objects.count()
注意count函数的返回值是一个数字。
- シーケンス
使用order_by对结果进行排序
默认升序
BookInfo.objects.all().order_by('readcount')
降序 在order_by()括号中的参数加上 - 就表示降序
BookInfo.objects.all().order_by('-readcount')
- 関連のお問い合わせ
书籍和人物的关系是 一对多
书籍中没有任何关于人物的字段
人物中有关于书籍的字段 book 外键
语法形式:
通过书籍查询人物信息(已知主表数据,关联查询从表数据)
主模型(实例对象).关联模型类名小写_set.all()
通过人物查询书籍信息(已知 从表数据,关联查询主表数据)
从表模型(实例对象).外键
例:すべての情報のクエリ1冊本の文字
通过书籍 查询人物
1. 查询书籍
book = BookInfo.objects.get(id=1)
2. 根据书籍关联人物信息
book.perpleinfo_set.all()
例:書籍情報1のために人を見つけるために
根据书籍 查询人物
from boook.models import PerpleInfo
1. 查询人物
person = PerpleInfo.objects.get(id=1)
2. 根据人物关联查询书籍
# person.book 实例对象
person.book
person.book.name # 得到真实的名字
- 関連するフィルタクエリ
由多模型类条件查询一模型类数据:
语法如下:
关联模型类名小写__属性名__条件运算符=值
注意:如果没有"__运算符"部分,表示等于。
语法形式
需要的是 书籍信息 ,已知条件是 人物信息
需要的是 主表数据 ,已知条件是 从表信息
filter(关联模型类型小写__字段__运算符=值)
需要的是 人物信息 ,已知条件是 书籍信息
需要的是 从表信息 ,已知条件是 主表信息
filter(外键__字段__运算符=值)
例:文字のために必要なクエリの本、書籍「郭ジン」
需要的是图书,条件是人物
1. BookInfo.objects.filter(perpleinfo__name__exact='郭靖')
2. BookInfo.objects.filter(perpleinfo__name='郭靖')
例:「8」を持つ人々を記述するために必要なクエリの本、書籍
BookInfo.objects.filter(perpleinfo__description__contains='八')
例:查询书名为“天龙八部”的所有人物
PerpleInfo.objects.filter(book__name='天龙八部')
例:查询图书阅读量大于30的所有人物
PerpleInfo.objects.filter(book__readcount__gt=50)
クエリセットを設定し、クエリ
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
1. all():返回所有数据。
2. filter():返回满足条件的数据。
3. exclude():返回满足条件之外的数据。
4. order_by():对结果进行排序。
二つの特徴2
1)惰性执行
创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用
例如,当执行如下语句时,并未进行数据库查询,只是创建了一个查询集books
books = BookInfo.objects.all()
继续执行遍历迭代操作后,才真正的进行了数据库的查询
for book in books:
print(book.name)
2)缓存
使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,
再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。
情况一:如下是两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载。
from book.models import BookInfo
[book.id for book in BookInfo.objects.all()]
[book.id for book in BookInfo.objects.all()]
情况二:经过存储后,可以重用查询集,第二次使用缓存中的数据。
books=BookInfo.objects.all()
[book.id for book in books]
[book.id for book in books]
3クエリセットを制限
削除または標準クエリセットをスライス、リミットとオフセットSQL句と同等であることができます。
注意:負のインデックスをサポートしていません。
クエリの新しいセットをスライスするように設定、クエリの復帰後、クエリがすぐに実行されません。
オブジェクトの取得は、直接[0] [0:1]と等価である場合に.get() 、しかしいかなるデータ、[0] IndexError例外開始剤が存在しない場合は
[0 :. 1]に.get()はデータが異常なイニシエータのDoesNotExistない場合。
例:ビューアを実行し、オプション1と2を取得します。
= BookInfo.objects.all書籍()[0:2]
書籍
- ページング
#クエリデータ
書籍BookInfo.objects.all =()
を導入#ページングクラス
django.core.paginatorインポートページネータのから
#ページングインスタンスを作成する
ページネータ=ページネータ(書籍、2)
取得した#指定されたページデータ
page_skus = paginator.page(1)
#はページングされたデータを取得
total_page = paginator.num_pages