モデルの操作に基づいて、DjangoのORM単一のデータベーステーブル
ORMの導入と基本的な使い方
ORM、O bject R&LT elational M apping、オブジェクトリレーショナルマッピングデータベースとDjangoで呼び出しを使用する方法です。ORMは、データベースのSQL文の接続と操作をカプセル化し、私たちは、複雑なSQL文を覚えなくても、データベースのPython実装作業を経て、オブジェクト指向のコードに精通していることができます。
ORMは大幅に我々はデータベースを操作するコードを簡素化しますが、それはまた、いくつかの効率化を引き起こします。選択する方法を、実際のアプリケーションのニーズを見てください。
使用します。
以下のアプリケーションフォルダ
models.py
のクラスファイルに対応する書き込みデータテーブルには、次の例を参照してください。class UserInfo(models.Model): id = models.AutoField(primary_key=True) username = models.CharField(max_length=10) password = models.CharField(max_length=32)
MySQLデータベースは、名前のorm01などのライブラリを作成するには:
create database orm01;
構成データベースを実行し、データベースがデフォルト軽量のSQLiteで使用されます。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
MySQLデータベースを使用するために、我々はする必要があり
settings.py
、次の形式へのファイルのデータベース構成の変更:#连接mysql的配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'orm01', 'HOST':'127.0.0.1', 'PORT':3306, 'USER':'root', 'PASSWORD':'123' } }
下のプロジェクトフォルダ(プロジェクトディレクトリ)で
__init__.py
ファイルを指定するには、以下のことを書きpymysql
接続されたクライアントを。すでにpymyqlローカルドライブがインストールされているものの、しかし、ジャンゴのMySQL接続のMySQLdbは、まだデフォルトのドライブを使用しますが、手動でプロジェクトを設定する必要になるのMySQLdbは、Pythonの3をサポートしていませんので。import pymysql pymysql.install_as_MySQLdb()
データベース同期命令を実行し、端末で次のコードを実行します。
python manage.py makemigrations #在migrations文件夹下面生成记录文件 python manage.py migrate #执行记录文件
このように、データテーブルが作成されます。私たちのテーブル名デフォルト:アプリケーション名_小文字のクラス名。
ターミナルでは、あなたは我々だけのコマンドを介してデータベーステーブルを構築している見ることができます。
ORMフィールドは、MySQLとの関係の実際のフィールドに対応します:
'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
'BinaryField': 'longblob',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'DurationField': 'bigint',
'FileField': 'varchar(%(max_length)s)',
'FilePathField': 'varchar(%(max_length)s)',
'FloatField': 'double precision',
'IntegerField': 'integer',
'BigIntegerField': 'bigint',
'IPAddressField': 'char(15)',
'GenericIPAddressField': 'char(39)',
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
'UUIDField': 'char(32)',
新しく作成したデータテーブルの名前を指定します
時々、私たちは、システムのデフォルトの形式と呼ばれるテーブルには、その後、それはそれは、テーブル名が何であるかをシステムに指示宣言することによって道を示すことができますしたくありません。
from django.db import models
# Create your models here.
class Student(models.Model):
# 模型字段
name = models.CharField(max_length=100,verbose_name="姓名")
sex = models.BooleanField(default=1,verbose_name="性别")
age = models.IntegerField(verbose_name="年龄")
class_number = models.CharField(max_length=5,verbose_name="班级编号")
description = models.TextField(max_length=1000,verbose_name="个性签名")
class Meta:
db_table="tb_student" # 指定表名为tb_student
verbose_name = "学生"
verbose_name_plural = verbose_name
データベーステーブル、および要件を満たすために、個々のフィールドがある場合、指定されたテーブルの別の効果も、このテーブルを使用することができ、データベースの移行の必要はありません。
テーブルにおける欠失を変更して再検索データ
増加(作成)
クラスによって作成されたモデルを保存します
obj = models.UserInfo(
username='alex',
password='sb'
)
obj.save()
作成方法で(使用)の作成
戻り値を使用すると、オブジェクト・モデルの作成方法を作成したレコードであります
models.UserInfo.objects.create(
username='一峰',
password='666'
)
変更(更新)
(従来の)更新方法によって改変
まず第一に、変更したいモデルオブジェクトのデータを検索し、次に変更するupdateメソッドを呼び出します。のみ呼び出す前にタイプをquerset更新し、モデルオブジェクトは、直接そのオブジェクトが更新の時間ではありません取得するにはgetメソッドを使用し、updateメソッドを呼び出すことはできません。
models.UserInfo.objects.filter(id=1).update(
username='alexxx',
password='bigsb',
)
モデルオブジェクトによって、変更を保存します(DRFが使用されます)
データは、オブジェクトモデルによって得られた場合、この更新プログラムによって修正することができ、修正モデルは、双方向データの現象の後に保存されたオブジェクト。
obj = models.UserInfo.objects.filter(id=1)[0]
obj.username = 'alex222'
obj.password = '11111'
obj.save()
一括作成します
list_obj = []
for i in range(10):
obj = models.UserInfo(
username='xx%s'%i,
password='66%s'%i,
)
list_obj.append(obj)
print(list_obj)
models.UserInfo.objects.bulk_create(list_obj)
update_or_create、更新されている作成されていません
データがないか、または1つだけあるだけを見つけることができないことに留意すべきです。データの状態は、複数のエラーがある場合。
a,b = models.UserInfo.objects.update_or_create(
username='alex',
defaults={
'id':20,
'password':'ooooo',
'age':84,
}
)
print(a) # 当前更新后的model对象,或者是你新增的记录的model对象
print(b) # 新增就是True,查询就False
[削除]
delete()
発信者は、クエリセットを収集することができ、オブジェクトモデルの方法であってもよいです。
models.UserInfo.objects.filter(id=1).delete()
お問い合わせ
単純なクエリの例
ret = models.UserInfo.objects.filter(id=1)
print(ret) #<QuerySet [<UserInfo: UserInfo object>]> -- []
obj = ret[0]
print(obj.id,obj.username)
比較問い合わせ
二重下線__
コマンドを追加する、単純な比較問合せ、そのような決意が大きいか小さい一定値以上か否か、空ではありません。
article_list = Article.objects.filter(pub_date__isnull=False, pub_date__lte=datetime.now())
このような方法は、一般的に使用されています。
isnull # 字段为空
lt # 小于
lte # 小于等于
gt # 大于
gte # da'yu'deng'y
クエリメソッド
13のメソッドの合計が、あろう知っているであろう。
all()
すべての結果のクエリは、結果がクエリセットのタイプです
ret = models.UserInfo.objects.all()
filter(**kwargs)
これは、結果がクエリセットタイプで、指定されたオブジェクトがフィルタ条件に一致する含まれています。
Book.objects.filter(title='linux',price=100)
カンマで区切られた条件、およびこれらの条件の数が確立されなければならない、と関係がある、または私たちの後ろここに書かれて、それが働いたりです直接、関係を学習します。
直接対象物に加えて、あなたもqueryestを使用してフィルタ方式を使用することができます。
ret = models.UserInfo.objects.all().filter()
取得(** kwargsから)
戻り値は、フィルタに一致するオブジェクトを、種類をクエリセットでない、列オブジェクトであり、その結果を返すだけで、彼らは複数の、あるいは全くのフィルタ条件を満たしている場合、エラーがスローされます一つのターゲットを。例外試してキャッチ。
Book.objects.get(id=1)
フィルタと比較GET
ret = models.UserInfo.objects.get(age=18)
ret = models.UserInfo.objects.filter(age=180)
- 唯一つのデータを取得し得ます。あなたはスーパーのデータを検索したり文句を言うでしょう二つのデータを見つけることができない場合は、結果を返すように要求を取得することであることではなく、クエリの結果セットよりもオブジェクトモデル:
# 1 UserInfo matching query does not exist. 啥也没查到
# 2 get() returned more than one UserInfo -- it returned 11! 结果多了,不行!
- fitlerが与えられていない、結果は対象のモデルであり、結果セットと呼ばれるクエリセットタイプのコレクション、であり、
exclude(**kwargs)
手段はこれを除外すると、戻り値はクエリセットタイプで、高価な操作が等しくない、与えられたフィルタ条件が含まれているオブジェクトが一致しない、除外しました。
Book.objects.exclude(id=6)
6オブジェクトのすべてのIdリターンは同じではありません。
また、クエリセットに基づいて呼び出すことができます除外
Book.objects.all().exclude(id=6)
order_by(field)
データ呼、ソートクエリ結果のクエリセットタイプ、デフォルトIDに従って昇順され、値またはタイプクエリセットを返します。
models.Book.objects.all().order_by('price','id')
価格の書き込みは直接、デフォルトでは価格の昇順に配置されています。あなたが順序フィールドを降順にしたい場合は、あなたがライン上のマイナス記号を書き、それがありますorder_by('-price')
。order_by('price','id')
条件は、昇順に複数の一種である。価格は、同じデータを行う。価格、昇順IDに従って
reverse()
コールへのデータのクエリセットの種類、クエリの結果、戻り値の型またはクエリセットの順序を逆に
count()
データ呼のクエリセットタイプは、オブジェクトの数(クエリセット)と一致するデータベースを照会返します。
ret = models.UserInfo.objects.all().count()
first()
データ呼のクエリセットのタイプは、最初のレコードを返します。
Book.objects.all()[0] = Book.objects.all().first()
得られたモデルは、オブジェクトではないクエリセット
last()
データ呼のクエリセットの種類、最後のレコード、および使用方法を返すfirst
同じ。
exists()
コールへのデータのクエリセットの種類、クエリセットがTrueデータ、リターンが含まれている場合、そうでなければFalse。
データの空のクエリセットの種類は、それはデータが存在していないデータベースを決定するために、時には直接使用するのに適していないにもブールTrueとFalseですが、。あなたは多くのデータを持っている場合、あなたは裁判官にそれを使用し、その後、あなたはすべてのデータをチェックアウトする必要があり、効率が悪いです。数または終了すると、例えば:
all_books = models.Book.objects.all().exists()
SQL文はに翻訳されています。
SELECT (1) AS a FROM app01_book LIMIT 1
リミット1を通じて、データを見てみていると、それは多くの、より高い効率で、そこではありません。
values(*field)
以上では。データ呼のクエリセットのタイプは、ValueQuerySet--特別なクエリセットを返します。オブジェクトのインスタンスを実行した後、モデルのシリーズを取得することはありませんが、辞書は、反復配列であり得ます。クエリセットロング戻り値の型として、あなたはクエリセットの種類を見つけるために、チェーンコール他の方法を続けることができるよう、他の方法は同じです。
クエリセットの呼び出し:
ret = models.UserInfo.objects.all().values('age','username')
コールへのオブジェクト - すべてのデータの値は以下の通りでした。
ret = models.UserInfo.objects.values('age','username')
values_list(*field)
これは、values()
戻り値が辞書のシーケンスであり、それはタプルのシーケンスを返し、非常に似ています
distinct()
返された結果のレコードから重複を廃棄呼にvalues_listを得られたデータと値のクエリセットタイプ、
ret = models.UserInfo.objects.all().values('age','username').distinct()
ret = models.UserInfo.objects.values('age','username').distinct()
MROは、フォーマット時間を作成します
あなたが作成すると、フィールドデータの日付の方法を追加
models.Book.objects.create(
publish_date = "2019-08-01", # 字符串
# publish_date = datetime.datetime.now(), 时间日期数据
)
アップデート和削除
更新更新データは、データのみのタイプをクエリセットする場合:
models.Book.objects.filter(id=2).update(username='xxx') #update的调用者是queryset类型数据
削除しますデータは、あなたがデータの種類をクエリセットを使用することができたとき、あなたは直接データオブジェクトを使用することができます。
models.Book.objects.filter(id=2).delete()
models.Book.objects.get(id=2).delete()
練習
- プレスのお問い合わせ、特定の本はこれまで価格が200よりも大きい公表します
- 出会う2017年8月に公開で始まるすべての書籍pyの名前
- すべての書籍とその発行者名の50,100または150名の料金をチェック
- 100-200とその価格との価格のためのすべての本のタイトル
- 検索人民出版社は書籍の価格(低ソートに高い、デエンファシス)を公表しました