Djangoのモデル(データベース)
Djangoのモデルは、データベースに関連付けられている、データベース関連のコードは通常、書かれているmodels.py
では、Djangoは、sqlite3のはPostgreSQL、MySQLの、SQLiteにも対応していオラクルを。そして、対応するデータベースを使用して他のデータベースでは、唯一、豊富が大幅APIの使用を容易にmodels.pyコードを変更していないことができsettings.pyに設定する必要があります。
MySQLはMySQLドライバをインストールしていない場合、あなたがインストールするには、次のコマンドを実行することができ、導入されたMySQLデータベース、および次の使用のために最も一般的に使用されるWebアプリケーションです。
pip install mysqlclient
データベース設定
設定MySQLはフォルダのみを投影する必要があるsettings.py
項目データベース・コンフィギュレーション・ファイルを検索するには、次のようにその情報が改正:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'user',
'USER': 'root',
'PASSWORD': 'mysql',
'HOST':'127.0.0.1',
'PORT':'3306',
}
}
上記の変数は、同じMySQLデータベースとユーザの設定に対応する、大文字でなければなりません。Djangoは、対応するMySQLデータベースとユーザに接続された、本明細書で提供されます。
:Djangoはモジュールが接続されているデフォルトのデータベースのMySQLdbを使用することで、このときは、2つの方法があり、MySQLdbは接続ライブラリを置き換えるためにpymysqlモジュールを使用する
一つの方法:__のinit __の.py以下のプロジェクトフォルダの名前に
やり方:中__ __ INITの.py以下のアプリアプリケーションフォルダ
固定書き込み:
import pymysql
pymysql.install_as_MySQLdb() # 告诉django用pymysql代替mysqldb连接数据库
モデルを作成します。
models.pyアプリのフォルダにモデルを定義した後、アプリのアプリケーションを作成しなければならないモデルを使用するには、優れたアプリケーションを作成することができます。
from django.db import models
class User(models.Model):
# user表的主键字段名就是id,id字段可以不写默认会帮你创建一个主键id字段
id = models.AutoField(primary_key=True)
# varchar(32) name字段是varchar(32) CharField在定义的时候必须要加max_length参数
name = models.CharField(max_length=32)
password = models.CharField(max_length=16)
def __str__(self):
return self.name
上記データテーブルのフィールド(名前)を表すクラスのプロパティは、データがCharFieldです(VARCHARに対応する)、のDateField(等価日時としてそこに入力し、データベース内のテーブルのクラス名を表し、models.Modelを継承しました)、MAX_LENGTHパラメータ定義された長さ。
一般的なフィールドタイプ
以下のリストは、フィールドのより一般的なタイプのいくつかを説明しています。
- CharFieldですが:中程度の長さフィールドの文字列への短絡を定義するために使用されます。あなたが保存するデータを指定する必要がありますMAX_LENGTH。
- テキストフィールド:任意の長さの大きな文字列。あなたがフィールドのフィールドを指定することができますが、フィールドがフォームに表示されている場合のみMAX_LENGTH(データベース・レベルで適用されません)が使用されます。
- IntegerFieldとは:フォームに入力された整数値を検証するために使用される整数(整数)の値を格納するフィールドです。
- DateFieldおよびDateTimeField型:記憶するための/ auto_now =トゥーレを(モデルが保存されるたびに、パラメータ(相互に排他的な)それぞれPython.datetime.dateこれらのフィールド(日付、日付/時刻情報を表し、特に断らdatetime.datetimeのオブジェクト。フィールドが)現在の日付に設定されているモデルが最初に作成されたとき、auto_now_add(日付のみを設定)し、デフォルトでは()ユーザーでカバーすることができ、デフォルトの日付を設定します。
- EmailField:あなたのメールアドレスを保存し、検証するために使用されます。
- FileFieldにとのImageField:ファイルや画像をアップロードするために使用されている(のImageFieldがちょうど画像の追加検証でアップロードされたファイルを追加します)。これらのパラメータは、アップロードされたファイルを格納する方法と場所を定義するために使用されています。
- AutoField:特殊なタイプの自動インクリメントIntegerFieldとです。あなたが明示的に主キーを指定しない場合は、このタイプの主キーは自動的にモデルに追加されます。
- ForeignKey:別の指定されたデータベースモデルと多くの関係のために(例えば、自動車メーカー、メーカーは車の多くを行うことができます)。キーモデルの関係を含む「A」側。
- ManyToManyField:多くの関係を指定するために使用される(例えば、本はいくつかのタイプを持つことができ、それぞれがいくつかの書籍を含めることができます)。私たちのライブラリアプリケーションでは、我々は彼らのForeignKeyを使用することは非常に似ていますが、あなたはグループ間の関係を記述するために、より洗練された方法を使用することができます。これらのパラメータは、(例えば、models.SET_NULL値は、単に値NULLに設定される)何が起こる定義関連on_deleteレコードが削除されています。
データテーブルを作成します。
次のモデルはテーブル構造を形成するために、データベースの同期を作成するために建設されました。最初のCD manage.py
は、次のコマンドを入力したフォルダ:
python manage.py makemigrations # 让 Django 知道我们在我们的模型有一些变更
python manage.py migrate # 创建表结构,将你的数据模型变动正在同步到数据库中
上記のチェックインの設定アプリアプリケーションの操作はに登録されていることを保証するために。
データベース操作
データを追加します
機能を追加し、データベースを操作するためのアプリケーションデータフォルダviews.pyアプリが追加されます。次の方法でデータを追加します:
方式一:通过create函数进行直接进行添加
user_obj = models.User.objects.create(name='linwow',password='123')
方式二:通过对象调用save()来添加
user_obj = models.User(name='linwow',password='123')
user_obj.save() # 对象调用save方法保存到数据库
方式三:
user_obj = models.User()
user_obj.name = 'linwow'
user_obj.password = '123'
user_obj.save()
方式四:首先尝试获取,不存在就创建,可以防止重复
models.User.objects.get_or_create(name='linwow', password='123')
# 返回的是一个元组,(object, True/False),创建时返回 True, 已经存在时返回 False
- 1に多くの、多くの、あるいは多くの関係に多く存在する場合には、オブジェクト関連クエリが出します
user_obj = models.User.objects.get(pk=1)
class_obj = models.Class.objects.get(name="python")
user_obj.cla_id = class_obj
user_obj.save()
データを取得します
Djangoは通常、このセットは、クエリセットと呼ばれるコレクションの結果であるデータベースからデータベースクエリの内容を取得するには、いくつかの方法を提供します。クエリデータが最後にあなたを取得することに注意してくださいデータオブジェクトまたはクエリセットであります
- すべて():内のユーザーSQL SELECT * FROMするすべてのオブジェクトモデルマネージャ()、同等のを介してすべてのデータ行を取得
user_list = models.User.objects.all() # 获取user表所有的数据
这样获取到的是QuerySet对象,只要是QuerySet就可以点query查看获取到当前QuerySet对象的内部sql语句
print(user_list.query)
- フィルタ()、条件は、フィルタ結果を提供することができるSQLでフィルタに対応する場合、空の戻りの不在のフィルタケースは、クエリセットオブジェクト
user_list = models.User.objects.filter(id=1) # 获取user表中id为1的数据
queryset对象支持索引取值 但是不推荐你使用 推荐使用自带的.first()获取第一条数据
user_query = models.User.objects.filter(name=linwow).first()
- ()を取得:オブジェクト自体ではなく、与えられた直接の問い合わせがない場合には取得したデータを直接取得することができ、単一のオブジェクトを取得します。
user_list = models.User.objects.get(id=1) # 如果数据不存在会报错,一般不推荐使用
メソッドのデータを取得します:
获取所有数据:
models.User.objects.all()
切片操作,获取10个人,不支持负索引,切片可以节约内存:
models.User.objects.all()[:10]
获取对应条件的值,get是用来获取一个对象的:
models.User.objects.get(name=name)
获取满足条件的一些人,就要用到filter:
models.User.objects.filter(name="abc") # 等于models.User.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
models.User.objects.filter(name__iexact="abc")
名称中包含 "abc"的人:
models.User.objects.filter(name__contains="abc")
名称中包含 "abc",且abc不区分大小写:
models.User.objects.filter(name__icontains="abc")
正则表达式查询:
models.User.objects.filter(name__regex="^abc")
正则表达式不区分大小写:
models.User.objects.filter(name__iregex="^abc")
排除包含wow的User对象:
models.User.objects.exclude(name__contains="wow")
找出名称含有abc, 但是排除年龄是23岁的
models.User.objects.filter(name__contains="abc").exclude(age=23)
1、如果只是检查User中是否有对象,应该用 user_list = models.User.objects.all().exists()
2、用 len(user_list) 可以得到User的数量,但是推荐用 models.User.objects.count()来查询数量。
3、list(user_list) 可以强行将 QuerySet 变成列表。
4、 去重方法user_list = user_list.distinct()
不要なフィールドを除外延期
複雑なケースでは、テーブルには、非常にいくつかのフィールドの内容かもしれPythonオブジェクトへの変換を取る延期は、これらのフィールドを除外するときに使用できるリソースの多くを取ります。
models.User.objects.all().defer('addr')
唯一のフィールドだけを選択する必要が
そして、必要なだけのユーザー名を見つけた場合のみ削除フィールドは、必要があり、逆に延期。
models.User.objects.all().only('addr')
データの更新
()またはupdate()を保存し、保存()メソッドが使用され、新しいデータが同じで、以下はどのように更新を記述するデータを変更するために使用することができます。
- .ALLのためのバッチ更新().filter().exclude()などのバックに。
- 単一のオブジェクトを更新に.getするように適合され()、get_or_create()、得られたobjを等update_or_create()。
models.User.objects.filter(id=1).update(name='lin',password='321')
データを削除します。
単純にすることができ、オブジェクトのdelete()メソッドを呼び出して、データベース内のオブジェクトを削除します。
- データIDを削除= 1
user_obj = models.User.objects.get(id=1)
test1.delete()
或者
models.User.objects.filter(id=1).delete()
- すべてのデータを削除します。
models.User.objects.all().delete()
データのソート
Djangoアプリケーションでは、アルファベット順に、例えば、フィールドの値に応じてソートされた結果を検索したい場合は。その後、ORDER_BY()その上でこのメソッドを使用して。
- あなたは、任意のフィールドを並べ替えることができます。
models.User.objects.all().order_by('name')
- あなたが標準フィールド(最初のフィールドの同じ値で使用される第2フィールド)の複数をソートする必要がある場合は、複数のパラメータを使用することができます。
models.User.objects.all().order_by('name','id')
- ( - )あなたはマイナスが先行し、逆の順序を指定することができ接頭辞:
models.User.objects.all().order_by('-name')