初始django
django 路由
路由匹配的三种模式
include 包含路由
django视图
函数视图
类视图
请求对象
响应对象
反向解析
django 模板
模板引擎
Django 需要一种方便的方式来动态生成 HTML
模板中的变量
模板标签
for
{% for item in data_list %}
<li>内容</li>
{% empty %}
<li>暂无内容<li>
{% endfor %}
{% for article in article_list %}
<ul>
<li>{{ article }}</li>
</ul>
{% endfor %}
for … empty
{% for article in article_list %}
<ul>
<li>{{ article }}</li>
</ul>
{% empty %}
<p> 文章不存在 </p>
{% endfor %}
cycle
<style>
.row1 {
color: red
}
.row2 {
color: chocolate
}
</style>
{% for article in article_list %}
<ul>
<li class="{% cycle 'row1' 'row2' %}">{{ article }}</li>
</ul>
{% empty %}
<p> 文章不存在 </p>
{% endfor %}
{% for key, value in info.items %}
<p>{{ key }}: {{ value }}</p>
{% endfor %}
{% if 18 <= info.age and info.age <= 25 %}
青春年少
{% else %}
未成年
{% endif %}
模板过滤器
模板继承和包含
extends
include
django模型
orm
orm 全称 Object-relational-mapping ,翻译过来就是对象关系映射。
我们先来介绍一下为什么要使用它。
我们在做的web开发,很多时候就是在面向数据库编程。操作数据库呢,就需要使用SQL语句,比如,这里我们要查询用户名为andy的数据。但是,我们需要使用编程语言例如Python, Java来操作数据库,而这些编程语言支持面向对象。所以,是否可以通过一种映射关系,不需要我们编写SQL语句,而是使用面向对象的方式来查询和操作数据库呢?这时候,ORM应运而生。简单来说,ORM就是让我们使用编程语言而不是SQL与数据库进行交互。
下面我们来看一下,他们是的映射关系。
在数据库中,有数据表,数据行,和字段, 那么,他们分别对应中面向对象中的类,对象,和属性。例如:
没使用orm前,我们需要创建数据表和字段,而现在我们用这种方式来创建。
然后通过实例化这个类,用类对象来操作数据的增删改查等等。
这就是orm。小伙伴,你学会了吗?
模型的增删改查
create : 新增/插入数据
read: 去取或查询数据
update: 修改
delete: 删除数据
新增数据
方式1: sava()保存
方式2:create新增数据
方式3:bulk_create()批量新增数据
实例1:save()
user_obj = User(username='zhangsan', password='123456')
user_obj.save()
实例2: create()
user_obj = User.objects.create(username='admin', password='password')
实例3:bulk_create()
user1 = User(username='zhangsan', password='123456')
user2 = User(username='lisi', password='123456')
userlist = [user1, user2]
User.objects.bulk_create(user_list)
关联插入
插入文章时,插入作者。
Article.objects.create(user=user, title='第一篇文章')
查询
all(): 返回所有数据
get(*kwargs): 按照查询条件返回单条数据
latest(fields)/earlist(*fileds): 返回最晚/最早的一条记录
first()/ last() : 返回第一条 / 最后一条记录
快捷方式: 若有则返回,若无,则创建后返回
object, created = User.objects.get_or_create(*args, **kwargs)
查询条件
get 和 filter的区别:https://stackoverflow.com/questions/3221938/difference-between-djangos-filter-and-get-methods
- 相等/等于/布尔条件
- 是否包含**字符串
- 以**开始/结束
- 日期及时间
- 外键关联
exact 等于
user1 = User.objects.get(id=6)
user2 = User.objects.get(id__excact=6)
iexact 像
user1 = User.objects.get(name__iexact='zhangsan')
布尔条件
- gt: 大于某个值
- gte: 大于或等于某个值
- lt: 小于某个值
- lte: 小于或等于
- isnull: 是否为空
是否包含
contains: 包含**值
name__contains = 'andy'
icontains: 不区分大小写
name__contains = 'san' # zhangsan , zhangSan
in: 在** 选项(列表)之内
以**开始/结束
- startswith, istartwith: 以** 开始
- endswith, iendswith: 以**结束
日期及时间
- date : 日期
- year: 年
- month: 月
- day: 天
- hour/minute/second: 时分秒
- week/ week_day: 星期
Article.objects.filter(updated_at__year=2022).count()
from datetime import datetime
new_year = datetime(2022,1,1)
Article.obejcts.filter(created_at=new_year)
多条件查询
方式1: filter()指定多个条件
User.objects.filter(age_gte=20).filter(status=1)
User.objects.filter(age_gte=20, status=1)
方式2: &运算符
User.objects.filter(age__get=20)&User.objects.filter(status=1)
方式3:Q()函数的使用, 支持&(且)和 |(或)
from django.db.models import Q
query = Q(status=1) & Q(age__gte=20)
User.obejcts.filter(query)
# 实例2
query = Q(nickname__icontains='张') | Q(nickname__icontains='李')
User.objects.filter(query)
修改模型
方式1:save() 修改单条
方式2:update() 批量修改数据
方式3: bulk_update() 批量修改数据
save()
user_obj = User.objects.get(username='zhangsan')
user_obj.age = 20
user_obj.save()
updata()
user = user.objects.filter(age=0)
user.update(age=19, statu=1)
bulk_update()
User.objects.bulk_update(ojbs, fileds, batch_size=None)
- objs:需要修改的记录列表
- fields: 指定需要修改的字段
- batch_size: 每次提交多少记录进行修改 ```python list_user = [] user1 = user.objects.get(id=1) user2 = user.objects.get(id=2) user3 = user.objects.get(id=3) list_user = [user1, user2, user3]
list_user[0].age = 30 list_user[1].age = 20
User.objects.bulk_update(list_user,[‘age’]) ```
后台
调试
vscode调试