前提:创建好项目文件demo,app名为app01.
基本实现步骤:
1、创建数据库(MySQL)
2、修改setting.py数据库配置
Django可以配置使用sqlite3,mysql,oracle,postgresql等数据库。Django默认使用的是sqlite3数据库,settigs.py里面:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # 默认使用的数据库引擎
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # 指定数据库所在的路径
}
}
Django项目也可以配置使用mysql数据库,使用如下配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 表示使用的是mysql数据库的引擎
'NAME': 'db1', # 数据库的名字,可以在mysql的提示符下先创建好
'USER':'root', # 数据库用户名
'PASSWORD':'', # 数据库密码
'HOST':'', # 数据库主机,留空默认为"localhost"
'PORT':'3306', # 数据库使用的端口
}
}
3、demo.__init__.py文件增加如下代码
import pymysql
pymysql.install_as_MySQLdb()
4、app.01目录下models.py文件,创建数据库表
from django.db import models
class UserGroup(models.Model):
"""
部门
"""
title = models.CharField(max_length=32)
class UserInfo(models.Model):
"""
员工
"""
nid = models.AutoField(primary_key=True) # 可不写,默认会生成一列id,int类型,自增
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
ug = models.ForeignKey("UserGroup",null=True) # UserGroup表的外键,可为空值
"""
注意:Python2.0以上的版本,需要在外键后面加上on_delete=models.CASCADE
例如:ug = models.ForeignKey("UserGroup",null=True,on_delete=models.CASCADE)
这一列在表格中的列名为 ug_id
"""
5、demo.settings.py目录下,在如下图位置,增加‘app01’.,如果在创建项目时已经创建app01,则系统会自动生成(如图)。
6、创建数据库表
执行命令: python manage.py makemigrations
python manage.py migrate
数据库操作/单表操作
from app01 import models
def index(request):
# 新增 create
models.UserGroup.objects.create(title='销售部')
models.UserInfo.objects.create(username='用户1',password='123',ug_id=1)
# --------------------------------------------------- #
# 查找 all / filter / values / values_list
group_list = models.UserGroup.objects.all()
"""
print(group_list) <QuerySet [<UserGroup: UserGroup object (1)>]>
group_list是QuerySet类型,类似于一个表
在ORM中,类代表表,对象代表一行数据
"""
for row in group_list:
print(row.id)
print(row.title)
info_list = models.UserInfo.objects.filter(nid=1) # id等于1的数据
info_list = models.UserInfo.objects.filter(nid__gt=1) # id 大于 1
info_list = models.UserInfo.objects.filter(nid__lt=1) # id 小于1
obj = models.UserInfo.objects.all().values('username','password')
# 取UserInfo表 username,password两列的值
# 结果仍为QuerySet类型,QuerySET[{'username':'xx','name':'xx'}]
bj = models.UserInfo.objects.all().values_list('username','password')
# QuerySet[('李二','123')]
# --------------------------------------------------- #
# 删除 delete
models.UserInfo.objects.filter(nid=3).delete()
# --------------------------------------------------- #
# 更新 update
models.UserGroup.objects.filter(id=1).update(title='公关部')
数据库操作/连表操作
from app01 import models
def index(request):
# 查找
infos = models.UserInfo.objects.all()
for row in infos:
print(row.username,row.password,row.ug_id,row.ug.title)
"""
直接连表 row.ug.title UserInfo表中的外键ug即代表了UserGroup表中的一行
"""
# --------------------------------------------------- #
# UserInfo,ug是FK字段 - 正向操作
obj = models.UserInfo.objects.all().first()
print(obj.username,obj.password,obj.ug.title)
# UserGroup,表名小写_set.all() - 反向操作
obj = models.UserGroup.objects.all().first()
print(obj.id,obj.title,obj.userinfo_set.all()) # 1 公关部 <QuerySet [<UserInfo: UserInfo object (2)>]>
for row in obj.userinfo_set.all():
print(row.username,row.password) # 用户1 123
return HttpResponse('index...')
select_related、prefetch_related
obj_list = models.UserInfo.objects.all() # => select * from userinfo
print(obj_list) # <QuerySet [<UserInfo: 1-李明明>, <UserInfo: 2-刘珊>]>
obj_list1 = models.UserInfo.objects.all().values("ut__title") # select * from userinfo inner join usertype on ...
print(obj_list1) # <QuerySet [{'ut__title': '销售部'}, {'ut__title': '公关部'}]>
obj_list2 = models.UserInfo.objects.all().select_related("ut") # 联表查询
# obj_list2 = models.UserInfo.objects.all().select_related("ut","gp") # 三张表 联表查询
for row in obj_list2:
print(row.ut.title) # 销售部 [换行] 公关部
"""
ForeignKey会降低性能,因此有些公司不做外键。
prefetch_related 不做连表,做多次查询 ,效率更高
"""
obj_list3= models.UserInfo.objects.all().prefetch_related('ut')
# 做两次查询
# select * from userinfo
# Django内部:ut_id = [1,2]
# select * from usertype where id in [1.2]
for row in obj_list3:
print(row.id,row.ut.title)
"""
1 销售部
2 公关部
"""
数据库字段
AutoField(Field) - int自增列,必须填入参数 primary_key=True
BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True
SmallIntegerField(IntegerField): - 小整数 -32768 ~ 32767
PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 正小整数 0 ~ 32767
IntegerField(Field) - 整数列(有符号的) -2147483648 ~ 2147483647
PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正整数 0 ~ 2147483647
BigIntegerField(IntegerField): - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
BooleanField(Field) - 布尔值类型
NullBooleanField(Field): - 可以为空的布尔值
CharField(Field) - 字符类型
- 必须提供max_length参数, max_length表示字符长度
TextField(Field) - 文本类型
EmailField(CharField): - 字符串类型,Django Admin以及ModelForm中提供验证机制
IPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
GenericIPAddressField(Field) - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
- 参数:
protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both"
URLField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证 URL
SlugField(CharField) - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
CommaSeparatedIntegerField(CharField) - 字符串类型,格式必须为逗号分割的数字
UUIDField(Field) - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
FilePathField(Field) - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
- 参数:
path, 文件夹路径
match=None, 正则匹配
recursive=False, 递归下面的文件夹
allow_files=True, 允许文件
allow_folders=False, 允许文件夹
FileField(Field) - 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
ImageField(FileField) - 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
width_field=None, 上传图片的高度保存的数据库字段名(字符串)
height_field=None 上传图片的宽度保存的数据库字段名(字符串)
DateTimeField(DateField) - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
DateField(DateTimeCheckMixin, Field) - 日期格式 YYYY-MM-DD
TimeField(DateTimeCheckMixin, Field) - 时间格式 HH:MM[:ss[.uuuuuu]]
DurationField(Field) - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
FloatField(Field) - 浮点型
DecimalField(Field) - 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度
BinaryField(Field)- 二进制类型
数据库字段参数
null 数据库中字段是否可以为空
db_column 数据库中字段的列名
default 数据库中字段的默认值
primary_key 数据库中字段是否为主键
db_index 数据库中字段是否可以建立索引
unique 数据库中字段是否可以建立唯一索引
unique_for_date 数据库中字段【日期】部分是否可以建立唯一索引
unique_for_month 数据库中字段【月】部分是否可以建立唯一索引
unique_for_year 数据库中字段【年】部分是否可以建立唯一索引
verbose_name Admin中显示的字段名称
blank Admin中是否允许用户输入为空
editable Admin中是否可以编辑
help_text Admin中该字段的提示信息
choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
error_messages 自定义错误信息(字典类型),从而定制想要显示的错误信息;
字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
如:{'null': "不能为空.", 'invalid': '格式错误'}
validators 自定义错误验证(列表类型),从而定制想要的验证规则
from django.core.validators import RegexValidator
from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
如:
test = models.CharField(
max_length=32,
error_messages={
'c1': '优先错信息1',
'c2': '优先错信息2',
'c3': '优先错信息3',
},
validators=[
RegexValidator(regex='root_\d+', message='错误了', code='c1'),
RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'),
EmailValidator(message='又错误了', code='c3'), ]
)
参考博文