第十四周-第三节课
django.setup()
import os
import random
import django
def create_reader():
for i in range(10):
reader = Reader(
name=f'name_{i}',
email=f'email_{i}@163.com',
null_test=None,
blank_test='',
whether_vip=random.choice([True, False])
)
# 通过clean_fields方法对当前对象进行自检
# 如果当前字段可以为None, 则需要将该字段置入exclude参数中
reader.clean_fields(exclude=['null_test'])
# 调用save会往数据插入一条数据或者更新一条数据
reader.save()
if __name__ == "__main__":
# 设置环境变量
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
django.setup()
from myblog.models import Reader
create_reader()
QuerySet
-
Create
- save
-
Retrieve
Django的
orm
时一条执行链, 而不是单个语句Reader.objects.all().filter(id__gt=300).order_by("name", "id")
orm尽量使用一些简单的接口
如果查询需求比较复杂, 尽量使用SQL
-
all
获取表中所有记录
如果表非常大, 一定要小心使用.
-
get
通过指定条件, 获取一条数据, 如果有多条, 则会报错
reader = Reader.objects.get(name="name_0")
-
filter
匹配满足条件的记录, 类似于
SQL
中的WHERE
语句reader_array = Reader.objects.filter(name="name_0")
-
比较
Reader.objects.filter(id__gte=300)
>=
-----gte
>
--------gt
<=
-------lte
<
--------lt
-
模糊匹配
类似于
WHERE 字段 LIKE '%xx%'
__startswith
__endswith
__icontains
-
-
exlude
与
filter
逻辑取反 -
限制返回的记录数
相当于
SQL
中的limit
reader_array[:5]
-
latest
# 需要在models, Meta中指定get_latest_by Reader.objects.latest()
-
order_by
Reader.objects.all().order_by("name", "id")
-
-
Update
-
save
reader.email = "test@163.com" reader.save()
-
-
Delete
如果想对整张表进行清除, 还是truncate table命令更快
-
delete
reader.delete()
-
高级
-
RAW
遇到复杂的场景, 需要使用
SQL
语句通过Reader._meta.db_table来获取记录所在表
queryset = Reader.objects.raw(f"select * from {Reader._meta.db_table} limit 1") list(queryset)
-
指定数据库
-
在settings配置该数据库,
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'polls', 'USER': 'root', 'PASSWORD': 'qwe369', 'HOST': '127.0.0.1', 'PORT': '3306' }, 'person': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'person', 'USER': 'root', 'PASSWORD': 'qwe369', 'HOST': '127.0.0.1', 'PORT': '3306' } }
-
使用参数using
reader.save(using='person')
Reader.objects.using('person').all()
-
-
事务
-
基于HTTP请求的事务
- 在
settings
中要设置ATOMIC_REQUESTS
为True
from django.db import transaction @transaction.atomic def my_view(request): 表达式...
- 在
-
基于视图具体逻辑的事务
from django.db import transaction def viewfunc(request): 表达式 with transaction.atomic(): 表达式A 表达式B ...
-