Django知识点(二)

1、model关系

Django知识点(二)_第1张图片

①ForeignKey,多对1

ForeignKey(to=关联model,to_field=“关联键”,on_delete=“级联删除选项”)

models.ForeignKey(to=User,to_field="id",on_delete=models.CASCADE)

Django知识点(二)_第2张图片

②OneToOneFiled,1对1

OneToOneField(to=关联model,to_field="关联键",on_delete="级联删除选项")

Django知识点(二)_第3张图片

③ManyToManyField,多对多

ManyToManyField(to=关联model)

Django知识点(二)_第4张图片

2、模型API-单实例

  • 类名.objects.get(filed=val,field1=val1)
  • 等同于增加where,多个查询条件逗号分隔,逻辑运算为and
  • 查询不到或多条记录抛出异常

3 、模型api-queryset

  • 列表显示全部记录 r = Topic.objects.all()

  • 打印输出查询语句,适用于QuerySet
    print(r.query)

  • 倒序列表(model中必须定义排序规则)
    Topic.objects.revers()

  • 自定义排序
    Topic.objects.order_by(“user”,"-id")

  • 投影操作-设置显示字段列表
    #返回字典
    Topic.objects.values(“title”,“content”)
    #返回元祖
    Topic.objects.values_list(“title”,“content”)

  • 去重操作
    Topic.objects.distinct()
    Topic.objects.values(“title”).distinct()

  • 切片操作,索引不支持负数,用于分页
    1表示跳过的记录数,4获取记录数
    result=Topic.objects.all()[1:4]
    切片后不能继续排序和过滤

  • 链式查询,多个操作组合使用
    Topic.objects.order_by("-id")[1:4]

  • QuerySet
    Django知识点(二)_第5张图片

4、模型API

  • 反向查询
    1对多和多对1,小写模型名_set
    Django知识点(二)_第6张图片
    多对多,小写模型名_set
    Django知识点(二)_第7张图片
    Django知识点(二)_第8张图片

  • 跨关系查询

小写实体名__字段名__条件查询关键字
多对1跨关系查询
Comment.objects.filter(topic__title="选举")
多对多跨关系查询
User.objects.filter(role__name="admin")
//跨关系多值查询
小写实体名__字段名__条件查询关键字

Topic.objects.filter(comment__content__exact='张三',title="选举")

Topic.objects.filter(comment__content__exact='张三').filter(title="选举")

  • F查询
//作用:对字段使用加减乘除、取模、幂运算
from django.db import connection
from django.db.models import  Q,F
Comment.objects.update(down=F('down')+10)
for sql in connection.queries:
     print(sql["sql"])
  • Q查询
//作用:封装参数,用于复杂查询,可以使用运算符|(or)、&(and)、~(not)
from django.db.models import  Q,F
print(Comment.objects.filter(Q(up__gt=F("down")) | Q(up=10)).query)
//如Q查询和关键字组合使用,Q对象必须在前
print(Comment.objects.filter(Q(up=10)|Q(down=71),content='李四').query)
  • 原生查询
//聚合查询:Avg、Count、Min、Max、Sum
//返回类型为字典,支持过滤、别名
Comment.objects.aggregate(up_sum=Sum('up'),down_min=Min('down'))
//分组聚合
//annotate,用于统计汇总,计算列以及别名
//返回值是QuerySet

result=Comment.objects.
values("topic_id").
annotate(up=Sum('up'),down=Sum('down'))
print(result.query)
//分组聚合
//计算列和别名
print(Article.objects.values("id").annotate(ne=F("like_num")*2).query)

CommentInfo.objects.filter(article__title__contains="重庆").annotate(title=F("article__title"),username=F("user__username")).values("title", "c_time", "username")

模型model百度脑图

5、视图

  • 在views.py文件中编写
  • 以函数或类的形式体现
  • 通常以HttpRequest类型作为传入参数,定义为request
  • 通常返回HttpResponseBase类型响应对象

6、路由

路由简单的来说就是根据用户请求的URL来判断对应的处理程序,并返回处理结果。
路由是URLs与视图映射
如果参数不匹配类型,或者路由无效。
函数的形参名和路由中定义的参数名保持一致

path配置

  • str:默认匹配除路径分隔符/之外的非空字符串,默认转换器,等同于str:day
  • slug:数字、字母、_、&
  • uuid:匹配格式化的uuid(通用唯一识别码)
  • path:任意非空字符,包括路径分隔符/

7、类视图

django.views.generic.base.View是所有类的基类
A.与请求类型(小写)同名的函数,实现请求转发。
B.使用url.py进行映射,必须使用view类方法as_View()进行转换。

从源码中查找
class TemplateView(TemplateResponseMixin, **ContextMixin**, View):
常用属性和方法
template_name --属性,指定模板名称
get_context_data--函数,设置数据源
  • ListView-列表页

model,指定模型名
template_name,指定视图渲染的模板。
context_object_name,指定获取的模型列表数据保存的变量名。这个变量会被传递给模板get_queryset,默认取出该表所有数据想要过滤自定义只能在get_queryset中
get_context_data,这个方法用来添加额外的内容到上下文变量中

8、模板

模板引擎也称后端(BACKEND),包括DTL和jinjia2
在项目配置文件settings.py的TEMPLATES变量中配置模板时,使用BACKEND选项配置模板引擎。
settings.py配置文件中添加模板的默认设置
Django的默认模板引擎为django.template.backends.django.DjangoTemplates,其语法为Django模板语言(简称DTL)。
django.template.backends.jinja2,Jinja2是另一个Django内置的模板引擎。
Django知识点(二)_第9张图片
1、Template对象适用于处理比较简单模板。
2、相对复杂的模板则应使用模板文件。
3、模板文件是一个包含了模板语言代码的文本文件。Django对模板文件扩展名没有要求,可以是.html、.txt等,也可以没有扩展名

Django模板引擎支持Django模板语言(简称DTL)
DTL包含变量、注释、过滤器、标签、模板继承以及HTML转义等语法。
1、变量
2、注释
3、标签:for
4、标签:if
5、过滤器
6、标签:include

过滤器用于显示变量前对变量的值进行调整,使用管道符(|)进行指定
{{content|safe}}
{{content|length}}

Django知识点(二)_第10张图片

  1. for 标签用于对可迭代对象进行遍历,包括列表、元组等
    Django知识点(二)_第11张图片
    Django知识点(二)_第12张图片

  2. if标签用于构造条件分支

 {% if var1 %}
   ……
{% elif var2 %}
   ……
{% else %}
   ……
{% endif %}
//elif和else块可以省略,elif块可以有多个。
  1. 标签 block…endblock: 父模板中的预留区域,该区域留给子模板填充差异性的内容,不同预留区域名字不能相同
    Django知识点(二)_第13张图片

  2. 子模板使用标签 extends 继承父模板
    {% extends “父模板路径”%}
    子模板如果没有设置父模板预留区域的内容,则使用在父模板设置的默认内容。子模板设置父模板预留区域的内容:
    Django知识点(二)_第14张图片

9、Form表单

1.应用下新建forms.py文件
2.必须继承django.forms.Form
3.验证规则编写,类似与model定义
字段名=forms.字段类型(属性名=属性值)
4.对象名=forms类构造函数(字典参数)
5.对象名.is_valid(),判断数据是否通过验证
  1. required,缺省为True,会生成标签required
  2. lable,生成lable标签
  3. initial,设置初始值
  4. help_text,填写的帮助信息
  5. widget,小部件,改变控件类型

Django知识点(二)_第15张图片

Django知识点(二)_第16张图片

Form表单对象如LoginForm
1、form=LoginForm()生成html标签
2、form=LoginForm(request.POST)验证post请求数据
3、form=LoginForm(request.GET)验证get请求数据
4、form.is_valid()验证是否符合定义规则
通过从form.cleaned_data获取数据
5、forms.errors可以提取出错信息

modelForm
Django知识点(二)_第17张图片

你可能感兴趣的:(django,django)