ディレクトリ
昨日のレビュー
视图层
小白必会三板斧
1.JsonResponse
默认只能序列化字典类型
如果你想序列化其他json能够支持的格式
你需要加一个参数safe=False
当你的数据有中文的时候 如果你不想自动转码
你需要制定一个参数 来告诉 你需要动内部任何数据
借助于原生的json模块作为参考依据
json.dumps(obj,ensure_ascii=False)
阅读源码 发现 json_dumps_params = {}
json.dumps(obj,cls,**json_dumps_params)
2.FBV与CBV
FBV
路由
路由与视图函数内存地址
视图
函数
CBV
路由
看似 路由与类点方法
实在还是路由与函数的内存地址
视图
类
# 只要是处理前端请求的业务逻辑的视图函数 都需要加上request形参
from django.views import View
class MyLogin(View):
def get(self,request):
return render(request,'login.html')
def post(self,request):
return HttpResponse('post请求')
urs.py
url(r'^login/',views.MyLogin.as_view())
# 1.函数名加括号执行优先级最高
# 2.该方法要么是普通函数 要么是绑定给类的方法
自动变形
url(r'^login/',views.view)
# 内部源码
def as_view(cls,**kwargs):
def view(...):
self = cls(...) # 生成自己写的类的对象
return self.dispatch(...) # 一定要确认self到底是谁
# 然后一定要问你一句 对象查找属性和方法的顺序(慢)
return view
# 一旦用户敲了login 会自动加括号调用view函数
def dispatch(...)
# 先判断当前请求方式在不在默认的八个请求方法内
if request.method.lower() in self.http_method_allowed:
# 利用发射 获取到方法名对应的属性或者是方法
handler = getattr(self,request.method.lower(),error)
else:
# 提示报错
return handler(...) # 调用请求方法所对应的函数
如何给CBV加装饰器
django推荐你使用内置的模块来给CBV加装饰器
from django.utils.decorators import method_decorator
# 1.直接在类上面装
method_decorator(wrapper,name='给类内部哪个方法装')
# 2.直接在类的内部方法上装
method_decorator(wrapper)
# 3.给类内部所有的方法都装 重写dispacth方法
method_decorator(wrapper)
模板层
1.模板语法的传值
python所有的基本数据类型全部支持
函数
会自动加括号调用 并且函数如果需要参数 那么模板语法不支持
类
会自动加括号实例化 产生对象
# 只要对象能够加括号调用 那么模板语法都会自动加括号
对象
直接传对象 显示的是对象的内容地址 你可以定义__str__来控制对象的展示
对象在html页面上可以调用绑定方法
2.过滤器的使用
语法结构 |
语法特点 会将|左边的数据当做第一个参数传入 :右边的数据当做第二个参数传入
|length
|add
|default:'默认值' # 类似于get方法和getattr方法
|slice:'2:9:2'
|filesizeformat # 将数字格式化成表示容量大小的单位
|truncatechars # 截取字符 包含三个点
|truncatewords # 截取单词 按空格算单词数 不包含三个点
|safe # 告诉浏览器文本内容是安全的 如果有html标签 正常识别渲染即可
前后端取消转义的方法
前端
|safe
后端
from django.utils.safestring import mark_safe
res = mark_safe('<a href='https://www.baidu.com'>点我</a>')
# 也就意味着 html代码可以不再html文件内写
# 可以在后端写html代码 然后传递给前端
3.标签
一对逻辑
if判断
for循环
for循环内部有一个forloop对象
该对象可以判断for循环的开始和结束 first last
也可以帮你获取索引或者数据计数 counter0 counter
for循环和if判断嵌套使用
{% for i in l %}
{% if forloop.first %}
第一次操作
{% elif forloop.last %}
最后一次操作
{% else %}
中间操作
{% endif %}
{% empty %}
如果for循环对象是空 执行empty内的逻辑
{% endfor %}
with起别名
自定义过滤器 标签 inclusion_tag
1.先在应用下创建一个名字必须交templatetags文件夹
2.文件夹内部创建一个任意名称的py文件(mytag)
3.py文件内必须先写两句代码
from django.template impory Library
register = Library()
@regiser.filters(name='过滤器的名字')
def index():
pass
@register.simple_tag(name='标签名字')
def index1():
...
@regisrer.inclusion_tag('html文件名',name='名字')
def index2():
...
如何使用自定义的
{% load 任意名称的py文件名mytag %}
模板的继承
当一个页面需要被频繁使用的时候 你可以考虑使用模板的继承
先通过block块划定后期可能需要修的区域
一个模板上通常一个有三块区域
css
一个
html内容
可以有多个
js 一个
如何使用模板
{% extends '模板的名字' %}
{% block css %}
修改模板中css区域内容
{% endblock %}
模板的导入
{% include '你要想导入的html文件名' %}
モデル層
1.設定のテストスクリプト
1.1アプリケーションファイルのテスト
書き込みコード(旧manage.pyコピーするコードの4行)に適用してファイルの直接試験、及び手動で書かれたコードの二行
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")
import django
django.setup()
-----------------------以上是配置代码------------------------
# 一定要等待测试脚本搭建完毕之后 才能导入django文件进行测试
from app01 import models
'''测试代码'''
1.2の新しいファイルの任意の名前
上記のコードを書くように、あなたもできます
2.データ変更検索の削除
データの作成2.1
1.create方法
直接保存されたデータに
book_obj = models.Books.objects.create(title='挪威的森林',price=123.23,pulish_date='2019-09-09')
book_obj = models.Books.objects.create(title='人间失格',price=222.23,pulish_date=ctime)
print(book_obj)
2.オブジェクト()メソッドの保存
結合を使用する方法のオブジェクト(値によってオブジェクトの例は、保存された使用法オブジェクト保存作成します)
book_obj = models.Books(title='我是猫',price=467.78,pulish_date='2019-02-22')
book_obj.save()
クエリセットオブジェクト
filter
チェック結果は、クエリセットオブジェクトであります
限り、この方法は、クエリセットクエリセットオブジェクトを呼び出すことであるとして、無制限であることができます
res = models.Books.objects.filter(pk=1).filter().filter().filter().filter()
限り、あなたは、オブジェクトを渡すことができますようクエリセットで
.query
対応するSQL文の現在の結果を表示res.query SELECT `app01_books`.`id`, `app01_books`.`title`, `app01_books`.`price`, `app01_books`.`publish_date` FROM `app01_books` WHERE `app01_books`.`id` = 1
2.2データを変更
pk
自動的後半PKは主キーフィールドを参照するために使用され、現在のテーブルの主キーフィールドを検索します
res = models.Books.objects.filter(pk=1)
print(res) # <QuerySet [<Books: Books object>]>
クエリセットを使用する方法1。update
models.Books.objects.filter(pk=2).update(price=333.33)
2.オブジェクトの使用 get与filter
使用を節約するために取得するには、この方法が推奨されていません
利用对象的修改 内部其实是重头到位将数据的所有字段都重新写一遍
book_obj = models.Books.objects.get(pk=3)
book_obj.price = 888.88
book_obj.save() # 对象的保存
フィルタとGETの違い
- クエリセットを取得するフィルタリストに類似オブジェクト、あります
- ゲットするデータ自体には直接であります
- 条件が存在しない場合
- フィルタは、直接バック空、推奨フィルタ方法に与えられていません
- 直接のエラーになります
削除データへ2.3
クエリセットを使用する方法1。 delete
models.Books.objects.filter(pk=3).delete()
2.オブジェクトの使用delete
方法
book_obj = models.Books.objects.get(pk=3)
book_obj.delete()
2.4クエリデータ 十三门徒
ORMのデフォルトのクエリステートメントは、あなたが本当にデータを使用する場合にのみ、お問い合わせ不活性である場合にのみ、文の実行ORM
res0 = models.Books.objects.filter(pk=1)
res1 = models.Books.objects
res2 = models.Books
res3 = models
print(res0,type(res0))
# <QuerySet [<Books: Books object>]> <class 'django.db.models.query.QuerySet'>
print(res1,type(res1))
# app01.Books.objects <class 'django.db.models.manager.Manager'>
print(res2,type(res2))
# <class 'app01.models.Books'> <class 'django.db.models.base.ModelBase'>
print(res3,type(res3))
# <module 'app01.models' from 'D:\\pycharm\\项目\\开课练习\\day53\\app01\\models.py'> <class 'module'>
自動的に対応するSQL文を印刷
あなたが内部の文を、対応するすべてのSQL文のORMを見たい場合は、設定ファイルの設定で直接することができ、コードを構成することができます
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
1.すべてのお問い合わせは、すべての()
オブジェクトリターンクエリセット
res = models.Books.objects.all()
print(res)
# <QuerySet [<Books: Books object>, <Books: Books object>, <Books: Books object>]>
2.スクリーニングフィルタ()
オブジェクトリターンクエリセット
フィルタパラメータとの関係のうち、あなたのネイティブSQL文の中の同等の、
res = models.Books.objects.filter(pk=1)
res = models.Books.objects.filter(pk=1,title='挪威的森林')
print(res)
3.スクリーニングGET()
データオブジェクトそのものを取得
条件は、エラーが存在しない指示します、そしてクエリが一意である必要があり、お勧めできません
res = models.Books.objects.get(pk=2)
print(res) # Books object
4.)(最初の最初にしてください
データオブジェクトを取得します。
最初のオブジェクト・データ・オブジェクトを取るクエリセット
res = models.Books.objects.filter(title='我是猫').first()
print(res) # Books object
print(res.title) # 我是猫
(最後の最後のテイク5)
データオブジェクトを取得します。
クエリセットオブジェクトは、最後のデータオブジェクトを受け取り
res = models.Books.objects.filter(title='我是猫').last()
print(res) # Books object
print(res.id) # 5
6.カウント数()
収益
統計データの数
res = models.Books.objects.count()
print(res) # 4
7.)(指定されたフィールド値の値を取得します
戻りクエリセットオブジェクトリストセット辞書
フィールドで指定されたデータ・オブジェクトの値を取得し、複数存在してもよいです
res = models.Books.objects.values('title','price')
print(res)
# <QuerySet [{'title': '挪威的森林', 'price': Decimal('123.23')}, {'title': '人间失格', 'price': Decimal('333.33')}, {'title': '我是猫', 'price': Decimal('888.88')}, {'title': '我是猫', 'price': Decimal('333.77')}]>
8.値values_list指定されたフィールドを取得()
戻るクエリセットは、セットのタプルのリストの形式で、オブジェクト
res = models.Books.objects.values_list('title')
print(res)
# <QuerySet [('挪威的森林',), ('人间失格',), ('我是猫',), ('我是猫',)]>
9.ソートORDER_BY()
指定されたフィールドに従ってソート、デフォルトフィールドを上昇する前に添加される-
シンボル降順
res = models.Books.objects.order_by('price')
print(res)
# <QuerySet [<Books: Books object>, <Books: Books object>, <Books: Books object>, <Books: Books object>]>
セマンティクスを明示的に使用all().order_by('')
res = models.Books.objects.all().order_by('price')
降順
res = models.Books.objects.order_by('-price')
10.逆の順序逆()
逆にオブジェクトが事前にソートされ、ORDER_BYと組み合わせる必要があり、一人では効果がありません
res = models.Books.objects.all().order_by('price').reverse()
11.除外...除外以外の()
オブジェクトリターンクエリセット
あなたは、フィールドを除外しています
res = models.Books.objects.all().exclude(title='我是猫')
print(res)
# <QuerySet [<Books: Books object>, <Books: Books object>]>
12.問合せ結果値は(存在するかどうかを決意)
ブール値を返します。
res = models.Books.objects.filter(pk=100).exists()
print(res) # False
13.再別個にクエリの結果()
同一でなければならない重複排除前提(IDも異なるが)、もよい.values('')
一緒に使用します
res = models.Books.objects.values('title')
print(res) # <QuerySet [{'title': '挪威的森林'}, {'title': '人间失格'}, {'title': '我是猫'}, {'title': '我是猫'}]>
res = models.Books.objects.values('title').distinct()
print(res) # <QuerySet [{'title': '挪威的森林'}, {'title': '人间失格'}, {'title': '我是猫'}]>
2.5二重下線魔法の方法
__gt
より大きい__lt
より大きい__gte
以上で__lte
以下で__lt
より大きい__in=['','']
固定パラメータのリストを取ります__range=(,)
範囲内で撮影(頭と尾の両方)- 日付フィールド
- その後プラスすることができます
__year,__month,__day
日付データを指定取得、データ特性の一部などの日付を取得します
- その後プラスすることができます
- ファジィクエリ
__startswith=''
そもそもクエリ...__endswith=''
最後にクエリ...__contains=''
クエリの途中で一部の文字があります(デフォルトでは大文字と小文字が区別されます)__icontains=''
先代i
大文字と小文字を区別しません
MySQLのあいまいクエリ
关键字like
%:匹配任意个数的任意字符
_:匹配一位任意的字符
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
models.Tb1.objects.filter(name__contains="ven") # 获取name字段包含"ven"的
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.filter(id__range=[1, 3]) # id范围是1到3的,等价于SQL的bettwen and
类似的还有:startswith,istartswith, endswith, iendswith
date字段还可以:
models.Class.objects.filter(first_day__year=2017)
date字段可以通过在其后加__year,__month,__day等来获取date的特点部分数据
# date
#
# Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
# Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
# year
#
# Entry.objects.filter(pub_date__year=2005)
# Entry.objects.filter(pub_date__year__gte=2005)
# month
#
# Entry.objects.filter(pub_date__month=12)
# Entry.objects.filter(pub_date__month__gte=6)
# day
#
# Entry.objects.filter(pub_date__day=3)
# Entry.objects.filter(pub_date__day__gte=3)
# week_day
#
# Entry.objects.filter(pub_date__week_day=2)
# Entry.objects.filter(pub_date__week_day__gte=2)
需要注意的是在表示一年的时间的时候,我们通常用52周来表示,因为天数是不确定的,老外就是按周来计算薪资的哦~
3.マルチテーブルクエリ
タイムタイプ
DateField(auto_now_add=True)
时间类型
auto_now:每次修改数据的时候会自动更新数据(只会展示最新的一次修改时间)
auto_now_add:当数据创建出来的时候,会自动将创建时间记录下来,适用于注册
テーブルのリレーション1.表を作成し、確立
from django.db import models
# Create your models here.
# 多表联查
# 书
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2)
publish_date = models.DateField(auto_now_add=True)
# 与出版社表关联 一对一
publish = models.ForeignKey(to='Publish')
# 与作者多对多关系
authors = models.ManyToManyField(to='Author')
# 出版社
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=64)
# 作者
class Author(models.Model):
name = models.CharField(max_length=32)
email = models.EmailField()
# 与作业详情页一对一
author_detail = models.OneToOneField(to='AuthorDetail')
# 作者详细
class AuthorDetail(models.Model):
name = models.BigIntegerField()
addr = models.CharField(max_length=64)
変更の検索に多くの追加と削除2.データ・フィールド
2.1増加 create()
分野は直接通過します
主キー値データと実際のフィールドパステーブル、
models.Book.objects.create(title='京华烟云',price=222.22,publish_id=1)
2.直接転送対象
データオブジェクト(あなたは、関連の着信を見つけたいオブジェクト)で合格仮想フィールド(仮想外部キーフィールド名)、
publish_obj = models.Publish.objects.filter(pk=2).first()
models.Book.objects.create(title='四世同堂',price=333.33,publish=publish_obj)
変更2.2 update()
分野は直接通過します
主キー値データと実際のフィールドパステーブル、
models.Book.objects.filter(pk=1).update(publish_id=3)
2.直接オブジェクトのプット
データオブジェクトとの伝記仮想フィールド、
publish_obj = models.Publish.objects.filter(pk=2).first()
models.Book.objects.filter(pk=1).update(publish=publish_obj)
2.3は削除します delete()
外部キー関係に削除するには、テーブルには、削除をカスケードデフォルトです。
models.Publish.objects.filter(pk=1).delete()
3.フィールド-多くの欠失は、検索を変更します
3.1増加 add()
第3のテーブルにデータを追加する()メソッド、支持体の両方のデジタル伝送を追加し、送信はまた、オブジェクトをサポートしているこれらの両方の複数であってもよいです
1.ダイレクトデジタル転送
# 获取主键为2的书籍对象
book_obj = models.Book.objects.filter(pk=2).first()
# 根据对象点第三张表的外键字段进行添加
book_obj.authors.add(1) # 给第三张表里的书籍绑定一个主键为1的作者
book_obj.authors.add(2,3) # 给第三张表里的书籍绑定主键为2和3的作者
2.パスオブジェクト
# 获取主键为2的书籍对象
book_obj = models.Book.objects.filter(pk=2).first()
# 获得author中主键为1,2的对象
author_obj = models.Author.objects.filter(pk=1).first()
author_obj2 = models.Author.objects.filter(pk=2).first()
# 书籍对象.authors进入第三张表中添加
book_obj.authors.add(author_obj,author_obj2 )
変更3.2 set(可迭代对象)
セット()メソッドは、複数のパスをサポートしている、あなたは(反復可能)を使用する必要があり、原則は削除して追加することです。
1.ダイレクトデジタル転送
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.authors.set((1,))
book_obj.authors.set((2,3))
2.パスオブジェクト
# 获取主键为2的书籍对象
book_obj = models.Book.objects.filter(pk=2).first()
# 获得author中主键为1,2的对象
author_obj = models.Author.objects.filter(pk=1).first()
author_obj2 = models.Author.objects.filter(pk=2).first()
book_obj.authors.set((author_obj,author_obj2 ))
3.3は削除します remove()
デジタルオブジェクトは、複数のパス、無反復をサポートすることができます
1.ダイレクトデジタル転送
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.authors.remove(1)
book_obj.authors.remove(2,3)
2.パスオブジェクト
book_obj = models.Book.objects.filter(pk=2).first()
author_obj = models.Author.objects.filter(pk=1).first()
author_obj2 = models.Author.objects.filter(pk=2).first()
book_obj.authors.remove(author_obj)
book_obj.authors.remove(author_obj,author_obj2 )
3.4空 clear()
3番目のテーブルに記録されたすべてのデータを削除します。
将书籍主键为2的对象,在第三张表中清除掉
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.authors.clear()
4.クロステーブルのクエリ
順方向および逆方向の問い合わせ
1.フォワード問い合わせ 关系字段
正向查询
具有外键关系字段的一方向无关系的一表的查询是正向
2.逆引き参照 表名小写+_set
反向查询
没有外键关系字段的表向有的表查询是反向
1.オブジェクトベースのクロステーブルのクエリ
子查询
フォワード問い合わせ
当正向查询
点击外键字段数据有多个的情况下,需要.all()
app01.Author.None 即加.all()
タイトル
# 查询书籍主键为2的出版社名称
book_obj = models.Book.objects.filter(pk=2).first()
print(book_obj.publish) #出版社对象
print(book_obj.publish.name) #出版社名称
# 查询书籍主键为4的作者姓名
book_obj = models.Book.objects.filter(pk=4).first()
print(book_obj.authors) # app01.Author.None
print(book_obj.authors.all()) # 拿到主键为4的作者名列表
逆引き参照
反向查询时
一对一查询需要 '表名小写'
一对多,多对多查询需要 '表名小写_set.all()`
タイトル
# 查询出版社是东方出版社出的书籍
publish_obj = models.Publish.objects.filter(name='东方出版社').first()
print(publish_obj.book_set.all())
# 查询作者是jason写的书
author_obj = models.Author.objects.filter(name='Jason').first()
print(author_obj.book_set) # app01.Author.None
print(author_obj.book_set.all()) # 写过的书籍
クロステーブルダブル下線の問い合わせに基づいて、2
联表操作
フォワード問い合わせ
写外键字段就相当于已经跨到了字段所关系的表中,你想要改表的哪个字段信息,只需要加__获取即可
タイトル
# 查询书籍主键为2的出版社名称
res = models.Book.objects.filter(pk=2).values('publish__name')
print(res)
# 查询书籍pk为2的作者姓名和邮箱
res = models.Book.objects.filter(pk=2).values('authors__name','authors__email')
print(res)
逆引き参照
反向查询 表名小写__字段
filter(表名小写__字段=值)
タイトル
# 获取书籍主键为2的出版社名称
res = models.Publish.objects.filter(book__pk=2).values('name')
print(res)
# 获取书籍pk为2的作者姓名与邮箱
res = models.Author.objects.filter(book__pk=2).values('name','email')
print(res)
連続スパン表
# 获取书籍pk为2的作者的手机号
res = models.Book.objects.filter(pk=2).values('authors__author_detail__phone')