①ForeignKey,多对1
ForeignKey(to=关联model,to_field=“关联键”,on_delete=“级联删除选项”)
models.ForeignKey(to=User,to_field="id",on_delete=models.CASCADE)
②OneToOneFiled,1对1
OneToOneField(to=关联model,to_field="关联键",on_delete="级联删除选项")
③ManyToManyField,多对多
ManyToManyField(to=关联model)
列表显示全部记录 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]
小写实体名__字段名__条件查询关键字
多对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="选举")
//作用:对字段使用加减乘除、取模、幂运算
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"])
//作用:封装参数,用于复杂查询,可以使用运算符|(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百度脑图
路由简单的来说就是根据用户请求的URL来判断对应的处理程序,并返回处理结果。
路由是URLs与视图映射
如果参数不匹配类型,或者路由无效。
函数的形参名和路由中定义的参数名保持一致
path配置
django.views.generic.base.View是所有类的基类
A.与请求类型(小写)同名的函数,实现请求转发。
B.使用url.py进行映射,必须使用view类方法as_View()进行转换。
从源码中查找
class TemplateView(TemplateResponseMixin, **ContextMixin**, View):
常用属性和方法
template_name --属性,指定模板名称
get_context_data--函数,设置数据源
model,指定模型名
template_name,指定视图渲染的模板。
context_object_name,指定获取的模型列表数据保存的变量名。这个变量会被传递给模板get_queryset,默认取出该表所有数据想要过滤自定义只能在get_queryset中
get_context_data,这个方法用来添加额外的内容到上下文变量中
模板引擎也称后端(BACKEND),包括DTL和jinjia2
在项目配置文件settings.py的TEMPLATES变量中配置模板时,使用BACKEND选项配置模板引擎。
在settings.py配置文件中添加模板的默认设置
Django的默认模板引擎为django.template.backends.django.DjangoTemplates,其语法为Django模板语言(简称DTL)。
django.template.backends.jinja2,Jinja2是另一个Django内置的模板引擎。
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}}
{% if var1 %}
……
{% elif var2 %}
……
{% else %}
……
{% endif %}
//elif和else块可以省略,elif块可以有多个。
1.应用下新建forms.py文件
2.必须继承django.forms.Form
3.验证规则编写,类似与model定义
字段名=forms.字段类型(属性名=属性值)
4.对象名=forms类构造函数(字典参数)
5.对象名.is_valid(),判断数据是否通过验证
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可以提取出错信息