将某个html的部分提前写好 之后很多html页面想使用就可以导入
直接在要导入的地方用以下代码即可:
{% include 'myform.html' %}
#仅适用于页面某个小的区域,不适用整个页面
django模型层
1)前期准备
django自带的sqlite3数据库对时间字段不敏感
,会展示错乱 所以习惯会切换成常见数据库:MySQL
django orm不会自动创建库需要提前准备好
1.cmd中创建库
create database 库名;
2.settings.py配置文件中把库sqlite3改为mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day55', # 库名
'USER': 'root',
'PASSWORD': '123',
'HOST': '127.0.0.1',
'PORT': 3306,
'CHARSET': 'utf8'}
3.模型层models.py中写入模型类(写张表)
class User(models.Model):
name = models.CharField(max_length=32, verbose_name='用户名')
age = models.IntegerField(verbose_name='年龄')
register_time = models.DateTimeField(verbose_name='注册时间', auto_now_add=True)
def __str__(self):
return f'用户对象:{self.name}'
4.写完模型类后执行数据库迁移命令
python38 manage.py makemigrations
python38 manage.py migrate
创建模型类补充知识
#字段参数:
verbose_name='用户名' #类似加一个注释
————————————————————————————————————————————————
#时间字段:
DateTimeField #年月日时分秒
DateField #年月日
#时间字段参数:
auto_now=True #每次操作数据都会自动更新当前时间
auto_now_add=True #创建数据自动获取当前时间,后续不人为修改则不更新
________________________________________________
# 模型类下创建__str__方法,可以让对象在执行打印操作时更好区分这是哪个对象
def __str__(self):
return f'用户对象:{self.name}'
2)测试环境搭建
需求:单独测试django某个功能层
django默认不允许单独测试某个py文件
如果想要测试某个py文件(主要models.py):
#方法一: 不建议使用,关掉就没
pycharm最下面选择Python Console 命令行测试环境
from app01 import models
models.User.objects.filter()
————————————————————————————————————————————————
#方法二:自己搭建 【推荐】
1.去manage.py文件中把前四行代码拷贝出来
2.在tests.py中下面一行粘贴上面四行代码 再额外加两句即可写测试代码
import os
import sys
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day55.settings')
import django
django.setup()
from app01 import models
print(models.User.objects.filter())
if __name__ == '__main__':
main()
3)ORM常见关键字
orm查看底层sql语句
由于orm底层还是sql语句,所以支持查看底层sql语句怎么生成的
1.当手上的结果是一个QuerySet对象 那么可以直接点query查看SQL语句
res = models.User.objects.all().values('name')
print(res)
"""
<QuerySet [{'name': 'jason'}, {'name': 'torry'}, {'name': 'kevin'}]
"""
print(res.query)
"""
SELECT `app01_user`.`name` FROM `app01_user`
"""
2.如果想查看所有orm底层的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',
},
}
}
当执行ORM语句后就会在下面打印出对应的SQL语句:
(1)create()
创建数据 打印的返回值是当前创建的数据对象
res = models.User.objects.create(name='阿兵', age=28)
res = models.User.objects.create(name='oscar', age=18)
res = models.User.objects.create(name='jerry', age=38)
res = models.User.objects.create(name='jack', age=88)
print(res)
(2)filter()
根据条件筛选数据 结果是QuerySet [数据对象1,数据对象2] 列表套数据对象
res = models.User.objects.filter()#QuerySet [数据对象1,数据对象2]
res = models.User.objects.filter(name='jason')
res = models.User.objects.filter(name='jason', age=18)#括号内支持多个条件但是默认是and关系(都成立结果才成立)
(3)all()
查询所有数据(不能筛选) 结果是列表套对象
res = models.User.objects.all()
(4)first()、last()
first()
获取Queryset中第一个数据对象 如果为空不存在则返回None
last()
获取Queryset中最后一个数据对象 如果为空则返回None
推荐用first不推荐索引的原因是:如果没有该数据索引会报错
# res = models.User.objects.filter(pk=100)[0]
res = models.User.objects.filter(pk=100).first()
res = models.User.objects.filter().last()
(5)update()
更新/更改数据
models.User.objects.filter().update() 批量更新
models.User.objects.filter(id=1).update() 单个更新
(6)delete()
删除数据(批量删除)
models.User.objects.filter().delete() 批量删除
models.User.objects.filter(id=1).delete() 单个删除
(7)values()
根据指定字段获取数据 结果是列表套字典数据
#获取所有条件中的name对应的值(后面跟.first()可以获取第一个)
res = models.User.objects.all().values('name')
res = models.User.objects.filter().values('name')
res = models.User.objects.values('name')
#获取主键是1的age对应的值
res = models.User.objects.filter(pk=1).values('age')
(8)values_list()
根据指定字段获取数据 结果是列表套元组数据
res = models.User.objects.values_list('name')
(9)distinct()
去重 需注意:数据必须一样(包括主键),一般都会去掉主键后去重
#把所有数据的年龄字段去重
res = models.User.objects.filter().values('age').distinct()
res1 = models.User.objects.all().values('age').distinct()
(10)order_by()
根据指定条件排序 默认是升序 字段前面加负号就是降序
res = models.User.objects.all().order_by('age')
res = models.User.objects.all().order_by('-age')
(11)get()
直接根据条件查询具体的数据对象 一旦条件不存在会直接报错 不建议使用
#获取主键是1的数据
res = models.User.objects.get(pk=1)
(12)exclude()
针对括号内的条件'取反'进行数据查询 QuerySet(可以看成是列表套对象)
#获取id不等于1的数据对象
res = models.User.objects.exclude(pk=1)
(13)reverse()
颠倒顺序 针对已排了序的结果集做颠倒 用的较少因为排序前面加-号就可以实现
res1 = models.User.objects.all().order_by('age').reverse()
(14)count()
统计结果集中数据的个数
res = models.User.objects.all().count()
(15)exists()
判断结果集中是否含有数据 如果有则返回True 没有则返回False
几乎不用因为所有数据自带布尔值
res = models.User.objects.all().exists()
标签:name,框架,models,res,django,filter,objects,User
From: https://www.cnblogs.com/lvqingmei/p/16990367.html