1、模板导入--->写了一个好看的组件,可以复用
1、写一个模板
2、在模板中:{% include '模板的名字'%}
2、模板的继承
1、写一个母版,留一个可扩展的区域(盒子),可以留多个盒子(留的越多,可扩展性越高)
{%block 名字%}
可以写内容
{%endblock%}
2 在子模板中使用:
{%block 名字%}
子模板的内容
{%endblock 名字%}
3 静态文件相关
1 写死静态文件:<link rel="stylesheet" href="/static/css/mycss.css"> 、
2 使用 static标签函数:
-{%load static%}
static返回值,会拼上传参的路径
-{% static "传参"%}
3 使用get_static_prefix 标签
-{%load static%}
get_static_prefix返回值是:静态文件的地址,相当于/static/
--{% get_static_prefix %}css/mycss.css
4 单表操作;
-数据迁移命令:
-python3 manage.py makemigrations --->只是对变化做一个记录,记录文件在app的migrations
-python3 manage.py migrate ---->把更改提交到数据库
-python3 manage.py showmigrations ---->查看那个没有提交到数据库
-查询api
<1> all(): 查询所有结果
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
<4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
<5> order_by(*field): 对查询结果排序('-id')
<6> reverse(): 对查询结果反向排序
<8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
<9> first(): 返回第一条记录
<10> last(): 返回最后一条记录
<11> exists(): 如果QuerySet包含数据,就返回True,否则返回False
<12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列
<13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<14> distinct(): 从返回结果中剔除重复纪录
-基于双下划线的模糊查询
Book.objects.filter(price__in=[100,200,300])
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__gte=100)
Book.objects.filter(price__lte=100)
Book.objects.filter(price__range=[100,200])
Book.objects.filter(title__contains="python")
Book.objects.filter(title__icontains="python")
Book.objects.filter(title__startswith="py")
Book.objects.filter(pub_date__year=2012)
import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day76orm.settings") 默认的setting是谁就传哪个 import django django.setup() 起动Django from app01 import models ****************新增*********插入数据的两种方式 方式一 :返回结果是一个对象 book=models.Book.objects.create(name='红楼梦',price=23.8,publish='人民出版社',author='曹雪芹',create_data='2018-09-17') print(book.name) 方式二:先实例化产生对象,然后调用save方法,保存 book=models.Book(name='水浒传',price=99.8,publish='老男孩出版社',author='施耐庵',create_data='2018-08-08') book.save() print(book.name) 时间格式,可以传字符串,可以传日期格式 import datetime ctime = datetime.datetime.now() book = models.Book.objects.create(name='西游记', price=73.8, publish='北京出版社', author='吴承恩', create_data=ctime) print(book.name) 删除****************** 删除名字叫西游记的这本书 ret=models.Book.objects.filter(name='西游记').delete() print(ret) 删除的第二种方式: ret = models.Book.objects.filter(name='西游记').first() ret.delete() **************修改 ret=models.Book.objects.filter(name='西游记').update(price=20.9) 对象修改(没有update方法,但是可以用save来修改) book = models.Book.objects.filter(name='西游记').first() book.price=89 book.save() 查询************************重点************************ (1)all() ret=models.Book.objects.all() print(ret) filter() 查询名字叫西游记的这本书 ret=models.Book.objects.filter(name='西游记').first() 不支持负数,只支持正数 ret=models.Book.objects.filter(name='西游记')[-1] print(ret) filter内可以传多个参数,用逗号分隔,他们之间是and的关系 ret=models.Book.objects.filter(name='西游记',price='73.8') ret.query -->queryset对象打印sql print(ret.query) get() 有且只有一个结果,才能用,如果有一个,返回的是对象,不是queryset对象,通常用在,用id查询的情况 ret=models.Book.objects.get(name='红楼梦') ret=models.Book.objects.get(id=1) print(type(ret)) exclude()查询名字不叫西游记的书,结果也是queryset对象 ''' SELECT `app01_book`.`id`, `app01_book`.`name`, `app01_book`.`price`, `app01_book`.`publish`, `app01_book`.`author`, `app01_book`.`create_data` FROM `app01_book` WHERE NOT ( `app01_book`.`name` = 西游记 AND `app01_book`.`price` = 23.8 ) ''' ret=models.Book.objects.exclude(name='西游记',price='23.8') print(ret) print(ret.query) order_by 按价格升序排 ret=models.Book.objects.all().order_by('price') print(ret) queryset对象可以继续 点 方法 ret=models.Book.objects.all().order_by('price').filter(name='西游记') print(ret) 按价格倒序排 ret=models.Book.objects.all().order_by('-price') print(ret) 可以传多个 ret=models.Book.objects.all().order_by('-price','create_data') print(ret) print(ret.query) reverse 对结果进行反向排序 ret=models.Book.objects.all().order_by('-price').reverse() print(ret) print(ret.query) count 查询结果个数 ret=models.Book.objects.all().count() ret=models.Book.objects.all().filter(name='西游记').count() print(ret) last 返回book对象 ret=models.Book.objects.all().last() print(ret) exists 返回结果是布尔类型 ret=models.Book.objects.filter(name='三国演义').exists() print(ret) values(*field): queryset对象里套字典 ret=models.Book.objects.all().values('name','price') ret=models.Book.objects.all().values('name') print(ret) value_list queryset对象里套元组 ret=models.Book.objects.all().values_list('name','price') print(ret) distinct() 必须完全一样,才能去重 只要带了id,去重就没有意义了 ret=models.Book.objects.all().values('name').distinct() print(ret) **************基于双下划线的模糊查询 查询价格大于89 的书 ret=models.Book.objects.filter(price__gt='89') print(ret) 查询价格小于89 的书 ret=models.Book.objects.filter(price__lt='89') print(ret) ret=models.Book.objects.filter(price__lt='89',price='89') 小于等于 ret=models.Book.objects.filter(price__lte='89') 大于等于, ret = models.Book.objects.filter(price__gte='89') print(ret) in 在XX中 ret=models.Book.objects.filter(price__in=['23.8','89','100']) print(ret) print(ret.query) range 在XX范围内 between and ret=models.Book.objects.filter(price__range=[50,100]) print(ret.query) contains 查询名字有'%红%'的书 ret=models.Book.objects.filter(name__contains='红') print(ret) print(ret.query) icontains 查询名字带p的书,忽略大小写 ret=models.Book.objects.filter(name__icontains='P') print(ret) print(ret.query) startswith 以XX开头 ret=models.Book.objects.filter(name__startswith='红') print(ret) print(ret.query) endswith ret=models.Book.objects.filter(name__endswith='梦') print(ret) pub_date__year 按年查询 ret=models.Book.objects.filter(create_data__year='2017') print(ret)