出典:https://blog.csdn.net/feifeiyechuan/article/details/84940951
ディレクトリ
四、1にDjangoのORMモデル1、運用の詳細に多くの-に多く、1
まず、DjangoORMの設定と作成
1、ORMの紹介
ORM(オブジェクト関係マッピング)リレーショナルオブジェクトマッピング。自動的にテーブルを作成するデータベースのクラス構造を定義します。
数値、文字列と時間:一般的に以下の一般的なデータ型を持って、データベースを作成します。
ORMは、二つのタイプに分けられます。
- DBまずデータベース操作データベースの種類に応じて生成されたクラスのテーブル構造によれば、データベースのテーブル構造を作成します
- データベースのテーブル構造を作成するためのコードを実行するコードを記述するためのコードファースト
主流のORMは、最初のコードです。ジャンゴORMは、最初のコードであるので、それの本質を学ぶための時間は、2つに分かれています。
- 自動的にカテゴリに応じてデータベース表を作成
- クラスデータベーステーブルに従って各種操作のためのデータ
2、設定ファイル
- 表示SQL文を設定します。
プロジェクトのsettings.pyファイル:
LOGGING = {
'version':1,
'disable_existing_loggers':False,
'handlers':{
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers':{
'django.db.backends':{
'handlers':['console'],
'propagate':True,
'level':'DEBUG'
},
}
}
- 構成データベースのMySQL
プロジェクトのsettings.pyファイル:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', #连接数据库种类
'NAME': 'test02_1209', #数据库名,****记得提前创建该数据库****
'USER': 'root', #用户名
'PASSWORD': 'root', #密码
'HOST': '127.0.0.1', #登陆主机
'PORT': '3306', #登陆端口
}
}
同時に、プロジェクトの__init__.pyファイル:
その理由は、Djangoのデータベースの動作はジャンゴの正しい識別を確実にするために、名前のMySQLdbによって識別され、しかしのpython3のpymysqlに使用されることです。
import pymysql
pymysql.install_as_MySQLdb()
- 登録アプリ
プロジェクトのsettings.pyファイル:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 'usermange.apps.UsermangeConfig', #pycharm自动生成,与下一行一样的作用
'usermange', #添加app,和上一行一样的意思
]
3、データモデルを作成
usermangeアプリケーションの下models.pyファイルには:
from django.db import models
# Create your models here.
class UserInfo(models.Model):
id = models.AutoField(primary_key=True)
uname = models.CharField(max_length=20)
uage = models.IntegerField()
ucdate = models.DateField(auto_now_add=True)
umdate = models.DateField(auto_now = True)
図4に示すように、生成されたテーブル構造
生成されたファイル名を指定して実行コマンド・ライン・テーブル構造:
python manage.py makemigrations #生成migrations临时文件
python manage.py migrate #根据生成的migrations直接生成数据库表结构
#后续每次如果更改了表结构,按顺序执行这两条命令即可
二、DjangoのORM CRUD
1、追加データ
#方法一:
UserInfo(uname='gaofei',uage=11).save()
# 方法二
userobj = UserInfo()
userobj.uname = 'zhang3'
userobj.uage = 22
userobj.save()
# 方法三
UserInfo.objects.create(uname='li4',uage=23)
#方法四
userobj1 = UserInfo.objects.get_or_create(uname='wang5', uage=24,default={'uname':'z6','uage':22})
print(userobj1)
#(<UserInfo: UserInfo object (4)>, True)
#如果通过前面的条件没有找到数据,那么新建一条记录,记录的字段赋值为default中的参数,返回(新建的对象,True)
# (< UserInfo: UserInfo object (4) >, False) #如果通过前面的条件查找到了一条数据,返回(该对象,False)
# 方法五:推荐使用
dicts = {'uname':'gaofeifeifei','uage':'22'}
UserInfo(**dicts).save()
2、データ変更
#===数据的修改
#批量更新:谨慎使用,如果数据量小最好用单个跟新
UserInfo.objects.filter(id=7).update(uname='gaofeifei')
# 单个更新,自动时间的跟新只支持单个跟新不支持批量跟新
userobj2 = UserInfo.objects.filter(id=7)[0]
userobj2.uname = 'gaofei'
userobj2.save()
#跟新或者创建
userobj3 = UserInfo.objects.update_or_create(uname='li4',uage=23,default='uname':'z6','uage':33})
#和get_or__create类似
#如果通过前面的uname,uage找到一条记录,按照default中的字段值进行修改,返回(跟新后的对象,False)
#如果通过前面的uname,uage找不到记录,新建一条记录按照default中的字段值进行赋值,返回(新建的对象,True)
3、削除データ
#批量删除,同样谨慎使用,别一失足成千古恨
UserInfo.objects.filter(uname='gaofeifei').delete() #删除满足条件的
UserInfo.objects.all().delete() #删除所有
#单个删除
userobj5 = UserInfo.objects.get(id = 8)
userobj5.delete() #虽然是两句话,但是执行的是一个sql语句
# 执行的sql语句为:
# DELETE FROM `usermange_userinfo` WHERE `usermange_userinfo`.`id` IN(8)
図4に示すように、データクエリ(フォーカス)
(1)すべてのデータのクエリメソッド
# 1、---查询所有数据的方法
datas1 = UserInfo.objects.all() #返回类型QquerySet,内部是所有对象的集合
datas2 = UserInfo.objects.values() #返回列表类型,是对象对应字典为元素的列表
print(type(datas1),'==>',datas1)
print(type(datas2),'==>',datas2)
# ----注意,对于返回值类型为QuerySet类型的数据,可以使用切片进行截取数据
print(datas1[2]) #获取下表索引为2的数据对象 使用了sql
print(datas1[1:3]) #获取下表1到3(取左不取右)的对象集合,类型为QuerySets 使用了python内部的排序
print(datas1[1:3:-1]) #倒序输出对象列表 使用了python的倒叙排列
条件に応じてクエリデータ(2)
- APIは、新たなクエリセットを返します。
メソッド名を説明
- フィルタ()フィルタクエリオブジェクト。
- ()を満たす条件は除外対象除外します
- 重合を用いて注釈()関数
- クエリセットをソートするORDER_BY()
- リバース()逆ソート
- 再クエリに異なる()セット
- 値()クエリセット辞書を含む特定のオブジェクトの値を返し
- values_list()と値()は類似しているが、代わりに辞書のタプルを返します。
- 日付は()の日付を設定し、クエリを取得します。
- 日付時刻()時間に応じて、クエリセットを取得します。
- 空のクエリセットを作成するには何もありません()
- すべて()すべてのオブジェクトを取得します。
- 労働組合()とのセット
- 交差点()交差点
- 差()差集
- 添付のクエリに関連するオブジェクトと)(select_related
- prefetch_related()前のお問い合わせ
- 余分な()追加のSQLクエリ
- 延期は()指定されたフィールドをロードしません。
- のみ()のみ指定したフィールドをロードします
- データベースを選択するには()を使用して
- トランザクションが終了するまで、選択したオブジェクトをロックするselect_for_update()。
- 生のSQLクエリを受け取る)(生
- 具体的な使用
#--filter
datas3 = UserInfo.objects.filter(uname='li4', uage=23) #获取同时满足参数的数据QuerySet集合
print(type(datas3),'==>',datas3)
#--get
datas4 = UserInfo.objects.get(id = 6) #获取同时满足参数的对象,如果查询结果为空或者有多条数据,报错
dataobj1 = UserInfo.objects.first() #返回第一个对象
dataobj2 = UserInfo.objects.last() #返回最后一个对象
#--exclude
datas5 = UserInfo.objects.exclude(uname='li4') #获取不满足条件的数据QuerySet集合\
#reverse()
datas6 = UserInfo.objects.all().reverse() #获取反转后的结果集,类型为QuerySet,可以进行多次的reverse()
#distinct()
# datas7 = UserInfo.objects.values('uname','id').distinct() #根据uname,id进行去重,返回去重后的QuerySet集合,内部为字典为元素的列表
# print(datas7)
#
# #order_by()
datas8 = UserInfo.objects.all().order_by('id') #根据id进行升序排序 返回结果为QuerySet,对象集合
datas8 = UserInfo.objects.all().order_by('-id') #根据id进行降序配许
#count()
data9 = UserInfo.objects.all().count() # 统计结果数量 #通过sql语句
data9 = UserInfo.objects.values().count()
data9 = UserInfo.objects.count()
#exists()
datas10 = UserInfo.objects.all().exists() #是否查询到数据,这个还是通过sql查询所有数据,如果返回有值为True,否则为False
datas10 = UserInfo.objects.values().exists()
datas10 = UserInfo.objects.filter(id=6).exists()
#values_lists()
datas11 = UserInfo.objects.values_list() #返回的结果集(QuerySet内部为结果元组为元素组成的列表)
- チェーンを探します
#链式查找
UserInfo.objects.filter(uname__contains='li') #模糊查询
UserInfo.objects.filter(uname__icontains='li') #忽略大小写模糊查询
UserInfo.objects.filter(uname__regex= 'li4$') #正则匹配
UserInfo.objects.filter(uname__iregex= 'li4$') #忽略大小写正则匹配
UserInfo.objects.filter(uname__exact='li4') #全匹配
UserInfo.objects.filter(uname__iexact='li4') #忽略大小写全匹配
UserInfo.objects.filter(uname__startswith='l') #以。。。开头
UserInfo.objects.filter(uname__istartswith='l') #忽略大小写,以。。。开头
UserInfo.objects.filter(uname__endswith='l') #以。。。结束
UserInfo.objects.filter(uname__iendswith='l') #忽略大小写,以。。。结束
UserInfo.objects.filter(uname__in=('i','li4')) #值是否在这个集合中,参数可以是列表,元组,集合
UserInfo.objects.filter(uage__lt=5) # 小于-------------------以下适用数字类型
UserInfo.objects.filter(uage__lte=5) #小于等于
UserInfo.objects.filter(uage__gt=5) #大于
UserInfo.objects.filter(uage__gte=5) #大于等于
UserInfo.objects.filter(uage__range=(11,12)) #在11-12范围内,包含11和12
UserInfo.objects.filter(ucdate__year=2018) #年份是否为2018-----------以下适用日期类型
UserInfo.objects.filter(ucdate__month=12) #月份为12
UserInfo.objects.filter(ucdate__day=10) #日期为10
print(UserInfo.objects.filter(ucdate__week_day= 1) ) #星期一 #the day of week from 1 (Sunday) to 7 (Saturday)
print()
UserInfo.objects.filter(ucdate__hour=12) #12点
UserInfo.objects.filter(ucdate__minute=20) #20分
UserInfo.objects.filter(ucdate__second=10) #10秒
三、ORMフィールドの紹介
1.フィールドタイプ
1、models.AutoField 自增列 = int(11)
如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField 字符串字段
必须 max_length 参数
3、models.BooleanField 布尔类型=tinyint(1)
不能为空,Blank=True
4、models.ComaSeparatedIntegerField 用逗号分割的数字=varchar
继承CharField,所以必须 max_lenght 参数
5、models.DateField 日期类型 date
对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField 日期类型 datetime
同DateField的参数
7、models.Decimal 十进制小数类型 = decimal
必须指定整数位max_digits和小数位decimal_places
8、models.EmailField 字符串类型(正则表达式邮箱) =varchar
对字符串进行正则表达式
9、models.FloatField 浮点类型 = double
10、models.IntegerField 整形
11、models.BigIntegerField 长整形
integer_field_ranges = {
'SmallIntegerField': (-32768, 32767),
'IntegerField': (-2147483648, 2147483647),
'BigIntegerField': (-9223372036854775808, 9223372036854775807),
'PositiveSmallIntegerField': (0, 32767),
'PositiveIntegerField': (0, 2147483647),
}
12、models.IPAddressField 字符串类型(ip4正则表达式)(已弃用,用13、)
13、models.GenericIPAddressField 字符串类型(ip4和ip6是可选的)
参数protocol可以是:both、ipv4、ipv6
验证时,会根据设置报错
14、models.NullBooleanField 允许为空的布尔类型
15、models.PositiveIntegerFiel 正Integer
16、models.PositiveSmallIntegerField 正smallInteger
17、models.SlugField 减号、下划线、字母、数字
18、models.SmallIntegerField 数字
数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField 字符串=longtext
20、models.TimeField 时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField 字符串,地址正则表达式
22、models.BinaryField 二进制
23、models.ImageField 图片
24、models.FilePathField 文件
25、distance_bigger_better_choice = ( # 枚举
(1, '是'),
(0, '不是')
)
distance_bigger_better = models.IntegerField(verbose_name="相似距离是否越大越像", choices=distance_bigger_better_choice)
2、フィールドパラメータ
null # 是否可以为空
default # 默认值
primary_key # 主键
db_column # 列名
db_index # 索引(db_index=True)
unique # 唯一索引(unique=True)
unique_for_date # 只对日期索引
unique_for_month # 只对月份索引
unique_for_year # 只对年做索引
auto_now # 创建时,自动生成时间
auto_now_add # 更新时,自动更新为当前时间
注:時間はPythonの操作、SQLない操作を成長しているため、更新時間、単一の更新を使用する必要が、あなたは最初のバッチ更新を使用することはできません。単一更新のすべてのデータが再提出されます。
四、1にDjangoのORMモデル1、運用の詳細に多くの-に多く、1