昨日のレビュー
1 自定义过滤器和标签
·第一步:注册app
·第二步:在app下创建templatetags包(不能改名)
·第三步:在包下新建xx.py文件(名字自起)
·第四步:写代码
from django import template
register = template.Library()
@register.filter 过滤器
@register.simple_tag
·第五步:在模版中使用
{
% load xx %}
{
{
a|过滤器名字:'b' }}
{
% 标签名 a b c %}
2 静态文件引入的三种方式
-第一种:/static/a/b/c
-第二种:
{
% load static %}
src = "{% static '参数' %}"
-第三种:
{
% load static %}
src = '{% get_static_prefix %}a/b/c'
3 模版的导入
-写一个xx.html
-在其他的yy.html直接饮用他
{
% include 'xx.html' %}
4 模版的继承
-写一个母版 base.html
{
% block 名字 %}
{
% endblock %}
-在其他模版中继承母版
{
% load 'base.html' %}
{
% block 名字 %}
填充的内容
{
% endblock %}
5 inclusion_tag
·第二步:在app下创建templatetags包(不能改名)
·第三步:在包下新建xx.py文件(名字自起)
·第四步:写代码
from django import template
register = template.Library()
@register.inclusion_tag('模版文件')
def xx():
return{
key:value}
·第五步:在模版中使用
{
% load xx %}
{
% 名字 参数 %}
6 单表常见字段,常见字段属性
-常见字段
-AutoField:自增
-CharField:varchar类型
-DecimalField:带小数点数字
-DateTimeField:年月日时分秒
-DateField:年月日
-常见字段属性
-主键
-max_length 最大长度
-max_digits
-decimal_places=2
公用的:
-null
-default
-db_index
7 单表新增的两种方式
8 单表的查询
-filter(key=value, key=value) # 返回queryset对象(列表)
-filter(key=value, key=value)[0]
-filter(key=value, key=value).first()
-get(key=value,key=value) # 返回一个对象,查询必须有且只有一个,不符合这个条件都抛异常
今日のコンテンツ
1一般的に使用される珍しいフィールドとパラメータの概要
# 常用字段
-IntegerField 整数
-AutoField
-BooleanField
-CharField
-DateField
-DateTimeField
-DecimalField
-FileField 上传文件,本质是varchar
-ImageField 图片,本质是varchar,继承了FileField
-TextField 存大文本
-EmailField 本质是varchar
# 非常用字段
-BigAutoField
-SmallIntegerField
-PositiveSmallIntegerField
-PositiveIntegerField
-BigIntegerField
'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
'BinaryField': 'longblob',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'DurationField': 'bigint',
'FileField': 'varchar(%(max_length)s)',
'FilePathField': 'varchar(%(max_length)s)',
'FloatField': 'double precision',
'IntegerField': 'integer',
'BigIntegerField': 'bigint',
'IPAddressField': 'char(15)',
'GenericIPAddressField': 'char(39)',
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
'UUIDField': 'char(32)',
# 常用参数
-null
-max_length
-default
-primary_key
-unique
-db_index
-choices:比较常用(后面再说)
-blank: django admin里提交数据,限制
# 元数据(写在类里)
-必须记住的
class Meta:
# 更改存在书库的表名,默认的是app01_book,这里改成book
db_table = "book"
# 指定联合索引
index_together = [
("name", "publish"),
]
# 指定联合唯一索引
unique_together = (("name", "publish"),)
-了解
# admin后台操作中显示的表名称
# 使用verbose_name,后台显示时会加s
verbose_name='图书表'
# verbose_name_plural则直接显示
verbose_name_plural='图书表'
# 注: 有与后台数据库交互的操作时使用迁移命令,没有则不需要,例如更改admin内显示的名字时就不需要
2ネイティブsqlステートメントを出力します
# 在配置文件粘贴
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
3単一テーブルクエリAPI
# 单表api操作
# 1 all 查询所有,返回queryset对象,目前先当成列表(像列表)
# 实际上一次只取出21条,all()实际上返回的是一个生成器
res = models.Author.objects.all()
print(res)
print(type(res))
# 2 filter 过滤
res = models.Book.objects.filter(author='莫言')
res = models.Book.objects.all().filter(author='莫言')
res = models.Book.objects.all().filter(author='莫言', publisher='人民文学出版社')
# 3 get
res = models.Book.objects.get(author='莫言')
res = models.Book.objects.all().get(author='莫言')
res = models.Book.objects.filter().get(author='莫言')
# 4 exclude排除
# 查询名字不是XX的数据
res = models.Book.objects.exclude(title='天堂蒜薹之歌').filter()
# 5 order_by 排序
res = models.Book.objects.order_by('id')
res = models.Book.objects.order_by('-id') # 倒序
res = models.Book.objects.order_by('name', '-id') # 先按name升序,再按id降序
# 6 reverse 必须结合order_by使用,对结果进行反转
res = models.Book.objects.order_by('id').reverse()
# 7 count 统计条数
# 不用len,也是orm的一种优化
res = models.Book.objects.exclude(title='天堂蒜薹之歌').count()
# 8 first
# 并不是查出来然后取第一条,而是直接查第一条
res = models.Book.objects.filter(author='莫言').first()
# 9 last
# 并不是查出来然后取最后一条,而是反向查第一条
res = models.Book.objects.filter(author='莫言').first()
# 10 exists 返回不再是queryset对象了,如果QuerySet包含数据,就返回True,否则返回False
res = models.Book.objects.filter(author='莫言').exists()
# 11 values(*field) (select title from book)
# 指定只查某几个字段,返回的是字典
# 返回一个ValueQuerySet——一个特殊的QuerySet运行后得到的并不是一序列
# model的实例化对象,而是一个可迭代的字典序列
res = models.Book.objects.all().values('title')
# 12 values_list 和values非常相似,返回的是一个元组
res = models.Book.objects.all().values_list('title')
# 13 distinct() 返回一个无重复结果
res = models.Book.objects.all().distinct()
4二重下線に基づくファジークエリ
#1 价格在[100,200,300]这个范围内
Book.objects.filter(price__in=[100,200,300])
# 2 大于,小于,大于等于,小于等于
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__gte=100)
Book.objects.filter(price__lte=100)
# 3 范围
Book.objects.filter(price__range=[100,200])
# 包含
Book.objects.filter(title__contains="python")
# 4 忽略大小写包含
Book.objects.filter(title__icontains="python")
# 5 以xx开头
Book.objects.filter(title__startswith="py")
# 6 时间类型,年份是2012年的
Book.objects.filter(pub_date__year=2012)
5テーブルレコードを削除します
# 删除的两种方式
# 第一种:queryset的delete方法
# res=models.Book.objects.all().delete()
# print(res)
# 第二种:对象自己的delete方法
# book = models.Book.objects.all().filter(name='金瓶梅').first()
# print(type(book))
# res=book.delete()
6テーブルレコードを変更する
#修改记录
# 第一种:queryset的update方法
# res=models.Book.objects.filter(publish='东京').update(name='金瓶梅1')
# print(res)
# 第二种:对象自己的
book = models.Book.objects.filter(name='xxx').last()
book.name='asdfasd'
book.save()
7スクリプトでdjangoサービスを呼び出す
# s1.py
import os
if __name__ == '__main__':
# 1 引入django配置文件
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MyLibrary1.settings")
# 2 让django启动起来
import django
django.setup()
# 3 使用表模型
from app01 import models
models.Book.objects.create()
補足
1タイムゾーンと国際化の問題
settings.py中
a 后台管理汉语问题
LANGUAGE_CODE = 'zh-hans'
b 时区问题(使用东八区)
# 更改以下两个参数:
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
2 django admin(管理バックグラウンドの簡単な使用)
-1创建一个后台管理账户
python3 manage.py createsuperuser
输入用户名:
输入邮箱(可不输入):
输入密码:
确认密码:
# 超级用户创建出来了,可以登录管理后台了
-2 admin中表中一行一行的数据显示我们定制的样子
重写模型类的__str__方法,就可以打印对象
3空白のパラメータの役割
# admin后台管理数据库
1 需要把book表注册到admin中
在app下的admin.py中写
from app01 import models
# 把book表注册一些,管理后台就能看到了
admin.site.register(models.Book)
2 可以快速的对book表进行增删查改操作
· 字段属性,blank=True # 在admin中新增数据可以为空
即使字段属性null=True,admin中添加数据还是不能为空,所以把blank设为True
# 修改和数据库有关才需要做迁移
操作
1チェーンコール(クエリセットはチェーンコールの使用)チェーンコールをサポートするクラスを実装します
2検証:querysetオブジェクト、forループにある場合、実際には21個のアイテムが出力されず、クエリsqlが実行されます
3次の操作を実行します
1 查询老男孩出版社出版过的价格大于200的书籍
2 查询2017年8月出版的所有以py开头的书籍名称
3 查询价格为50,100或者150的所有书籍名称及其出版社名称
4 查询价格在100到200之间的所有书籍名称及其价格
5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
4頻繁に使用されるフィールドと異常に使用されるフィールド、頻繁に使用されるパラメータと異常に使用されるパラメータを整理し、ネイティブsqlを出力し、apiをクエリし、ファジークエリを実行し、テーブルレコードを削除し、テーブルレコードを変更し、Pythonスクリプトがdjango環境を呼び出します。
5 14のメソッドのうちクエリAPIを整理します。これらのメソッドは、クエリセットオブジェクトであり、クエリセットオブジェクトではない値を返します。また、それらは何ですか。