-
CRUD
- 查询
-
带条件的查询
Entry.objects.filter(条件)
1. Author.objects.filter(id=1)
2. 查询谓词 : __查询谓词
__exact :
__contains :
__startswith :
__endswith :
… …示例: Author.objects.filter(name__startswith='王')
-
Entry.objects.exclude(条件)
只做不等值 -
Entry.objects.get(条件)
特点:只返回一条数据时使用
-
- 修改
- 修改单条数据
1.查 2.改 3.保存 - 批量数据
QuerySet 的 update()
- 修改单条数据
- 删除
delete()
- 查询
-
F() 和 Q()
- F()
运行过程中获取某列的值
F(‘列名’)
Author.objects.update(age=F(‘age’)+10) - Q()
Q(条件1)|Q(条件2)
- F()
-
原生的数据库操作方法
- 查询
Entry.objects.raw(‘sql’) - 增删改
with connection.cursor() as cursor:
cursor.execute(‘sql’)
return ‘’
- 查询
-
后台
-
创建后台管理员
python3 manage.py createsuperuser -
基本管理
-
admin.py 中注册要管理的实体
admin.site.register(Entry) -
定义Models的展现形式
-
重新定义 str()
class Author(models.Model):def __str__(self): return self.xx
-
通过verbose_name修改显示的字段名
name = models.CharField( max_length=30, verbose_name = "姓名" )
- 通过Meta内部类
class Meta: 1.db_table 指定当前实体类对应的表名 (设置完成后马上同步数据库) 2.verbose_name 在实体类中的显示名(单数) 3.verbose_name_plural 效果同上(复数)
-
-
-
高级管理
1.声明并注册高级管理类\class EntryAdmin(admin.ModelAdmin): pass admin.site.register(Entry,EntryAdmin)
2.在EntryAdmin中实现的高级管理功能
1.list_display
2.list_display_links
3.list_editable
4.list_filter
5.search_field
6.date_hierarchy
7.fields
8.fieldsets
===================================================
-
关系映射
-
一对一映射
- 语法
在关联的两个类中的任何一个类中:
属性 = models.OneToOneField(Entry) - 示例
class Author(models.Model): xxx xxx class Wife(models.Model): xxx xxx #增加一对一 author=models.OneToOneField(Author)
``
- 练习:
1.创建一个Wife类,属性如下
1.name , 2.age
2.在Wife类中增加一对一关联关系,引用 Author
3.同步回数据库并观察结果
- 查询
在 Wife 中,通过 author 属性找到对应的author对象
在 Author 中,通过 wife 属性找到对应的wife对象
- 语法
-
一对多映射
-
语法
在"多"实体中,对"一"的实体进行引用
属性 = models.ForeignKey(Entry) -
示例
一个出版社允许出版多本图书
一本图书只能属于一个出版社
class Publisher(models.Model):
xxx xxxclass Book(models.Model):
xxx xxx
publisher = models.ForeignKey(Publisher,null=True)- 练习:
1.完成Book 和 Publisher 之间的一对多
2.查看数据库效果
3.登录到后台,查看Book实体
- 练习:
-
数据查询
- 通过 Book 查询 Publisher
通过 publisher 属性查询即可
练习:
查询 西游记 对应的出版社信息,打印在终端上 - 通过 Publisher 查询 对应的所有的 Books
Django会在Publisher中增加一个属性来表示对对应的Book们的查询引用
属性:book_set (Entry.objects)
- 通过 Book 查询 Publisher
-
-
多对多映射
1.语法
在关联的两个类中的任意一个类中,增加:
属性 = models.ManyToManyField(Entry)
2.示例
一个作者可以出版多本图书
一本图书可以被多名作者同时编写class Author(models.Model): xxxx xxxx class Book(models.Model): xxxx xxxx authors = models.ManyToManyField(Author)
-
数据查询
1.通过 Book 查询对应的所有的 Authors
可以通过authors表示对应所有Author的查询对象book.authors.all() -> 获取 book 对应的所有的author的信息 book.authors.filter(age__gt=80) -> 获取book对应的作者中年龄大于80岁的作者的信息
2.通过 Author 查询对应的所有的Books
Django会生成一个属性 book_set 用于表示对对应的book的查询对象author.book_set.all() author.book_set.filter()
-
-
request - 请求对象
-
什么是request
HttpRequest , 在Django中就是请求对象,默认会被封装到视图处理函数的参数中 - request -
request中的成员
- request.scheme : 请求协议
- request.body : 请求主体(POST,PUT)
- request.path : 请求的具体资源路径
- request.get_full_path : 请求的完整路径
- request.get_host() : 请求的主机
- request.method : 请求方式
- request.GET : get请求方式中封装的数据
- request.POST : post请求方式中封装的数据
- request.COOKIES : 请求中的cookies的相关数据
- request.META : 请求中的元数据(消息头)
request.META[‘HTTP_REFERER’] : 请求源地址
-
request.method
使用:判断 request.method 值,分析用户的请求意图if request.method == 'GET': 去往指定的模板进行显示 else: 接收请求提交的数据
-
获取请求提交的数据
-
使用get方式
- 语法
request.GET[‘参数名’]
request.GET.get(‘参数名’,‘默认值’)
request.GET.getlist(‘参数名’) - 能够产生get请求方式的场合
- 地址栏的请求
<a href="地址?参数=值&参数=值">
- location.href=‘地址?参数=值&参数=值’
- 表单中的method为get
<form method='get'> 姓名:<input type="text" name="uname"> </form>```
- 注意:
url(r'^01-xxx/(\d{4})/$',request_views), def request_views(request): request.GET['']
- 地址栏的请求
- 语法
-
使用post方式
- 语法
request.POST[‘参数名’]
request.POST.get(‘参数名’,’’)
request.POST.getlist(‘参数名’) - CSRF验证
CSRF
Cross-Site Request Forgey
跨 站点 请求 伪装
解决方案:
1. 取消 csrf 验证(不推荐)
删除 settings.py 中 MIDDLEWARE 中的 CsrfViewsMiddleWare 的中间件
2. 开放验证
在视图处理函数增加 : @csrf_protect
@csrf_protect
def post_views(request):
pass
3. 通过验证
需要在表单中增加一个标签
{% csrf_token %}
- 练习:果园项目的注册部分
1.创建一个数据库 - FruitDay
2.创建实体类 - Users
1.uphone - varchar(11)
2.upwd - varchar(50)
3.uemail - varchar(245)
4.uname - varchar(20)
5.isActive - tinyint 默认值为1 (True)
3.完善注册 - /register/
1.如果是get请求,则去往register.html
2.如果是post请求,则处理请求数据
将提交的数据保存回数据库
- 语法
-
-
- request的方法有以下列表
- [‘COOKIES’, ‘FILES’, ‘GET’, ‘META’, ‘POST’, ‘class’, ‘delattr’, ‘dict’, ‘dir’, ‘doc’, ‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘gt’, ‘hash’, ‘init’, ‘iter’, ‘le’, ‘lt’, ‘module’, ‘ne’, ‘new’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘setattr’, ‘sizeof’, ‘str’, ‘subclasshook’, ‘weakref’, ‘_encoding’, ‘_get_post’, ‘_get_raw_host’, ‘_get_scheme’, ‘_initialize_handlers’, ‘_load_post_and_files’, ‘_mark_post_parse_error’, ‘_messages’, ‘_post_parse_error’, ‘_read_started’, ‘_set_post’, ‘_stream’, ‘_upload_handlers’, ‘body’, ‘build_absolute_uri’, ‘close’, ‘content_params’, ‘content_type’, ‘csrf_processing_done’, ‘encoding’, ‘environ’, ‘get_full_path’, ‘get_host’, ‘get_port’, ‘get_raw_uri’, ‘get_signed_cookie’, ‘is_ajax’, ‘is_secure’, ‘method’, ‘parse_file_upload’, ‘path’, ‘path_info’, ‘read’, ‘readline’, ‘readlines’, ‘resolver_match’, ‘scheme’, ‘session’, ‘upload_handlers’, ‘user’, ‘xreadlines’]
···