翼度科技»论坛 编程开发 python 查看内容

Django学习笔记

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
1.常用命令

创建项目:django-admin startproject 项目名
创建APP(进入工程目录):python manage.py startapp 网站名
创建库表(进入工程目录):python manage.py makemigrations
执行库表建立(进入工程目录):python manage.py migrate
启动运动:python manage.py runserver
模板渲染嵌入语法:在html可以嵌入后台语言 区分符号-》>     {%命令%}  {{变量}}
2.编写setting

在INSTALLED_APPS里添加APP的目录名进去
改语言 LANGUAGE_CODE = 'zh-hans'
3.在APP目录创建templates文件夹

渲染文件,用于存放html文件
4.编写APP下的views
  1. def index(request):
  2.     return render(request,'index.html')
复制代码
5.编写项目urls(路由)
  1. from myblog import views #导入views
  2. path('',views.index) #路由页面
  3. #path转换器:
  4. int:<int:page>
  5. str:<str:name>
  6. slug:<slug:xxx>  #匹配带符号的文本
  7. path:<path:xxx>  #匹配地址包括/
  8.    
  9. #name命名
  10. #模板中使用:{% url 'name' %}
  11. #url反向解析
  12. path('index',views.index,name='index_name') #路由页面
  13. {% url 'name' %}
  14. {% url 'name' '参数值1' '参数值2' %}
  15. {% url 'name' age='参数值1' name='参数值2' %} #命名传参
复制代码
6.在项目init下配置Mysql
  1. import pymysql
  2. pymysql.install_as_MySQLdb()
复制代码
7.setting中配置MySQL
  1. DATABASES = {
  2. 'default': {
  3.   'ENGINE': 'django.db.backends.mysql', # 数据库引擎
  4.   'NAME': 'django_mysql', # 数据库名
  5.   'USER': 'root', # 账号
  6.   'PASSWORD': 'root', # 密码
  7.   'HOST': '127.0.0.1', # HOST
  8.   'POST': 3306, # 端口
  9. }
  10. }
复制代码
8.models.py模板
  1. class Student(models.Model):
  2. """
  3. 创建如下几个表的字段
  4. """
  5. # 学号 primary_key=True: 该字段为主键
  6. studentNum = models.CharField('学号', primary_key=True, max_length=15)
  7. # 姓名 字符串 最大长度20
  8. name = models.CharField('姓名', max_length=20)
  9. # 年龄 整数 null=False, 表示该字段不能为空
  10. age = models.IntegerField('年龄', null=False)
  11. # 性别 布尔类型 默认True: 男生 False:女生
  12. sex = models.BooleanField('性别', default=True)
  13. # 手机 unique=True 该字段唯一
  14. mobile = models.CharField('手机', unique=True, max_length=15)
  15. # 创建时间 auto_now_add:只有在新增的时候才会生效
  16. createTime = models.DateTimeField(auto_now_add=True)
  17. # 修改时间 auto_now: 添加和修改都会改变时间
  18. modifyTime = models.DateTimeField(auto_now=True)
  19. # 指定表名 不指定默认APP名字——类名(app_demo_Student)
  20. class Meta:
  21.         db_table = 'student' #表名
  22.         verbose_name = '学生'  # 在admin站点中显示的名称
  23.     verbose_name_plural = verbose_name  # 显示的复数名称
  24. def __str__(self):
  25.         """定义每个数据对象的显示信息"""
  26.         return self.name
复制代码
  1. #定义英雄模型类HeroInfo
  2. class HeroInfo(models.Model):
  3.     GENDER_CHOICES = (
  4.         (0, 'male'),
  5.         (1, 'female')
  6.     )
  7.     hname = models.CharField(max_length=20, verbose_name='名称')
  8.     hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')  
  9.     hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
  10.     hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')  # 外键
  11.     is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
  12.     class Meta:
  13.         db_table = 'tb_heros'
  14.         verbose_name = '英雄'
  15.         verbose_name_plural = verbose_name
  16.     def __str__(self):
  17.         return self.hname
复制代码
数据库表名:模型类如果未指明表名,Django默认以 小写app应用名_小写模型类名 为数据库表名。
可通过db_table 指明数据库表名。
9.数据库的增删改查

查询数据
  1. Student.objects.all() #获取表中全部数据
  2. Student.objects.all().order_by('-id') #id倒序
  3. Student.objects.filter(name='tom1') #过滤查询
  4. Student.objects.get(name='tom1') #获取一条数据,没有就报错
  5. Student.objects.count() #查询结果数量
  6. Student.objects.values('colums') # 只返回指定字段,字典
  7. Student.objects.values_list('colums') # 只返回指定字段,元组
复制代码
过滤查询

实现SQL中的where功能,包括

  • filter 过滤出多个结果
  • exclude 排除掉符合条件剩下的结果
  • get 过滤单一结果
1)相等
exact:表示判等。
例:查询编号为3的图书。
  1. BookInfo.objects.filter(id__exact=3)
  2. # 可简写为:
  3. BookInfo.objects.filter(id=3)
复制代码
2)模糊查询
contains:是否包含。
说明:如果要包含%无需转义,直接写即可。
例:查询书名包含’游’的图书。
  1. BookInfo.objects.filter(btitle__contains='游')
复制代码
startswith、endswith:以指定值开头或结尾。
例:查询书名以’记’结尾的图书
  1. BookInfo.objects.filter(btitle__endswith='记')
复制代码
以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.
3) 空查询
isnull:是否为null。
例:查询书名不为空的图书。
  1. BookInfo.objects.filter(btitle__isnull=False)
复制代码
4) 范围查询
in:是否包含在范围内。
例:查询编号为1或3或5的图书
  1. BookInfo.objects.filter(id__in=[1, 3, 5])
复制代码
5)比较查询
gt :大于 (greater then)
gte :大于等于 (greater then equal)
lt :小于 (less then)
lte :小于等于 (less then equal)
例:查询编号大于3的图书
  1. BookInfo.objects.filter(id__gt=3)
复制代码
不等于的运算符,使用exclude()过滤器。
例:查询编号不等于3的图书
  1. BookInfo.objects.exclude(id=3)
复制代码
6)日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
例:查询1980年发表的图书。
  1. BookInfo.objects.filter(bpub_date__year=1980)
复制代码
例:查询1980年1月1日后发表的图书。
  1. BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
复制代码
F对象
之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中。
语法如下:
F(属性名)
例:查询阅读量大于等于评论量的图书。
  1. from django.db.models import F
  2. BookInfo.objects.filter(bread__gte=F('bcomment'))
复制代码
可以在F对象上使用算数运算。
例:查询阅读量大于2倍评论量的图书。
  1. BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
复制代码
聚合函数
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg(平均),Count(数量),Max(最大),Min(最小),Sum(求和),被定义在django.db.models中。
例:查询图书的总阅读量。
  1. from django.db.models import Sum
  2. BookInfo.objects.aggregate(Sum('bread'))
  3. # 注意aggregate的返回值是一个字典类型
复制代码
排序
使用order_by对结果进行排序
  1. BookInfo.objects.all().order_by('bread')  # 升序
  2. BookInfo.objects.all().order_by('-bread')  # 降序
复制代码
增加数据

create方式插入
通过  模型类.objects.create()保存。
  1. HeroInfo.objects.create(
  2.     hname='沙悟净',
  3.     hgender=0,
  4.     hbook=book
  5. )
复制代码
save方式插入
  1. from app_demo.models import Student
  2. import random
  3. """
  4. 插入测试数据
  5. """
  6. def insert(request):
  7. # 随机整数 作为学号
  8. for i in range(0, 5):
  9.   studentNum = int(random.uniform(0, 1) * 10000000000)
  10.   # 从models文件中获取student对象
  11.   student = Student()
  12.   # 给对象赋值
  13.   student.studentNum = studentNum
  14.   student.name = 'tom' + str(i)
  15.   student.age = 15
  16.   student.sex = random.choice([True, False])
  17.   student.mobile = int(random.uniform(0, 1) * 10000000000)
  18.   # 插入数据
  19.   student.save()
  20. return HttpResponse('数据插入完毕')
复制代码
  1. from datetime import date
  2. book = BookInfo(
  3.     btitle='西游记',
  4.     bput_date=date(1988,1,1),
  5.     bread=10,
  6.     bcomment=10
  7. )
  8. book.save()
复制代码
修改数据
  1. def modify(request, studentNum):
  2. # 通过学号获取student对象
  3. student = Student.objects.get(studentNum=studentNum)
  4. # 设置student的name为jack
  5. student.name = 'jack'
  6. student.save()
  7. return HttpResponse('修改成功.')
复制代码
save
修改模型类对象的属性,然后执行save()方法
  1. hero = HeroInfo.objects.get(hname='猪八戒')
  2. hero.hname = '猪悟能'
  3. hero.save()
复制代码
update
使用模型类.objects.filter().update(),会返回受影响的行数
  1. HeroInfo.objects.filter(hname='沙悟净').update(hname='沙僧')
复制代码
删除数据
  1. def delete(request, studentNum):
  2. student = Student.objects.get(studentNum=studentNum)
  3. student.delete()
  4. return HttpResponse('删除成功.')
复制代码
10.将models转换为json
  1. from django.core import serializers
  2. tools = Tools.objects.all()
  3. json_data = serializers.serialize('json', tools)
  4. json_data = json.loads(json_data)
复制代码
11.CORS跨域配置

下载corsheader
  1. pip install django-cors-headers
复制代码
修改setting.py中配置

在INSTALLED_APPS中增加corsheaders
  1. INSTALLED_APPS = [
  2.      'django.contrib.admin',
  3.      'django.contrib.auth',
  4.      'django.contrib.contenttypes',
  5.      'django.contrib.sessions',
  6.      'django.contrib.messages',
  7.      'django.contrib.staticfiles',
  8.      'corsheaders',#这是我们的主角,放在新建的其他项目之前
  9.      'app01',
  10. ]
  11. MIDDLEWARE = [
  12.      'django.middleware.security.SecurityMiddleware',
  13.      'django.contrib.sessions.middleware.SessionMiddleware',
  14.      'corsheaders.middleware.CorsMiddleware', #注意顺序,必须放在这儿
  15.      'django.middleware.common.CommonMiddleware',
  16.      'django.middleware.csrf.CsrfViewMiddleware',
  17.      'django.contrib.auth.middleware.AuthenticationMiddleware',
  18.      'django.contrib.messages.middleware.MessageMiddleware',
  19.      'django.middleware.clickjacking.XFrameOptionsMiddleware',
  20. ]
复制代码
setting 里再进行这样的配置
  1. CORS_ORIGIN_ALLOW_ALL = True
  2. CORS_ALLOW_CREDENTIALS = True
  3. #允许所有的请求头
  4. CORS_ALLOW_HEADERS = ('*')
复制代码
12.模板标签
  1. if:
  2.         {% if %}
  3.         {% endif %}
  4. for:
  5.         {% for i in list %}
  6.         {% empty %}
  7.         {% endfor %}
复制代码
for内置变量-forloop:

变量描述forloop.counter循环的当前迭代(从1开始索引)forloop.counter0循环的当前迭代(从0开始索引)forloop.revcountercounter值的倒序forloop.revcounter0counter0值的倒序forloop.first如果是第一次循环,则为真forloop.last如果是最后一次循环,则为真forloop.parenloop当嵌套循环,parentloop表示外层循环模板过滤器

语法:{{ 变量 | 过滤器1:'参数值1' | 过滤器2:'参数值2' ...}}
常用过滤器

过滤器说明lower将字符串转换为全部小写upper将字符串转会为大写形式safe默认不对变量内的字符串进行html转义add:"n"将value的值增加ntruncatechars:'n'如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“.….")结尾。模板继承
  1. 父模板:
  2.     {% block block_name %}
  3.     {% endblock %}
  4. 子模板:
  5.     开头使用:{% extends %}
  6.     {% block block_name %}  #block_name与父模板对应
  7.     {% endblock %}
复制代码
简化变量
  1. {& with val.xxx as i &}
  2. {% endwith %}
复制代码
来源:https://www.cnblogs.com/pigke/p/17487569.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具