1、 配置文件:

  1. media
  2. avatar = models.FileField(upload_to='avatar')
  3.  
  4. sessiongs MEDIA_ROOT=os.path.join(BASE_DIR,"blog","media","uploads")
  5.  
  6. 文件上传:BASE_DIR/"blog"/"media"/"uploads"/avatar/a.png
  7.  
  8. urls
  9. # media 配置
  10. MEDIA_URL="/media/"
  11. url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
  12.  
  13. <img src="/media/avatar/a.png">

2、url配置:

  1. url(r'^articles/([0-9]{4})/$', views.year_archive), # year_archive(request,1990) 无名分组
  2. url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), # year_archive(request,year=1990) 有名分组

3、反向解析:

  1. in urls:
  2. url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
  3. url(r'^index/$', views.index, name='Index'),
  4. 方式一
  5. in template(模板反向解析):
  6.  
  7. <a href="articles/2012/">2012 Archive</a>
  8. <a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
  9. 方式二
  10. in views(视图函数反向解析):
  11. from django.core.urlresolvers import reverse
  12. from django.http import HttpResponseRedirect
  13.  
  14. #return redirect("/index/") # hard code
  15. return HttpResponseRedirect(reverse('Index'))

4、视图函数:

  1. 请求对象---request
  2. 1HttpRequest.body 请求元数据
  3.  
  4. 2HttpRequest.path:一个字符串,表示请求的路径组件(不含域名)
  5. 3HttpRequest.method
  6.  
  7. 5HttpRequest.GET
  8. 6HttpRequest.POST
  9.  
  10. 7HttpRequest.FILES
  11.  
  12. 8HttpRequest.user 一个 AUTH_USER_MODEL 类型的对象
  1. 响应对象:
  2.  
  3. return HttpResponse("") # 返回字符串实例
  4. return render(request,"template",{"":""}) # 返回字符串实例 (**********)
  5. return redirect("/index/") # 重定向 (**********)

5、模板语言:

views:

  1. def foo():
  2. name="yuan"
  3. l=[111,222,333]
  4. d={"info":[obj1,obj2]}
  5. return render(request,"index.html",locals())

1、变量:{{name}}

  1. ---深度查询 句点符 {{l.0}} {{d.info.0.name}}
  2.  
  3. ----过滤器:{{name|date:"Y-m-d"}}

2、标签

  1. {%for i in l%}
  2. {{ i }}
  3.  
  4. {%empty%}
  5. <p>没有符合条件的书籍</p>
  6. {%endfor%}
  7.  
  8. --------
  9.  
  10. {%if name == "yuan"%}
  11. <p>真帅</p>
  12.  
  13. {%elif ...%}
  14. {%endif%}

3、继承模板:

  1. (1) base.html : {%block con%}{%end block con%}
  2. (2) index.html:
  3. {% extends "base.html"%} 继承
  4. {%block con%}
  5. {{block.super}} 模板盒子中内容
  6. {%end block con%} 覆盖

6、models(模型) -----ORM

映射关系:

  1. sql中表名--------------python的类名
  2. sql中表的字段----------python的类属性
  3. sql中表的记录----------python的类对象
  4.  
  5. class Article(models.Model):
  6. nid = models.BigAutoField(primary_key=True)
  7. title = models.CharField(max_length=50, verbose_name='文章标题')
  8. read_count = models.IntegerField(default=0)

单表操作:

  1. 添加操作
  2. views
  3.   #方法1:
  4. article_obj=models.Article.objects.create(nid=1,title="yuan",read_count=12) # create方法返回的是当前创建的文章对象
  5.  
  6.   #方法2:
  7. article_obj=models.Article(nid=1,title="yuan",read_count=12)
  8. article_obj.save()
  9. 删除:
  10. models.Article.objects.filter(title="python").delete() # 默认级联删除

  11. 修改:
  12. models.Article.objects.filter(title="python").update(read_count=F("read_count")+10)
  13.  
  14. 查询API
  15. <1> all(): 查询所有结果 #QuerySet
  16.  
  17. <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 #QuerySet
  18.  
  19. <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
  20. 如果符合筛选条件的对象超过一个或者没有都会抛出错误。# model对象
  21.  
  22. <5> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 #QuerySet
  23.  
  24. <4> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
  25. model的实例化对象,而是一个可迭代的字典序列 #QuerySet
  26.  
  27. <9> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 #QuerySet
  28.  
  29. <6> order_by(*field): 对查询结果排序 #QuerySet
  30.  
  31. <7> reverse(): 对查询结果反向排序 #QuerySet
  32.  
  33. <8> distinct(): 从返回结果中剔除重复纪录 #QuerySet
  34.  
  35. <10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 # int
  36.  
  37. <11> first(): 返回第一条记录 # model对象
  38.  
  39. <12> last(): 返回最后一条记录 # model对象
  40.  
  41. <13> exists(): 如果QuerySet包含数据,就返回True,否则返回False

querySet支持链式操作:
models.Article.objects.all().filter().values().distinct().count()
QuerySet数据类型:

  1. 1、可切片,可迭代 [obj,....]
  2. 2、惰性查询:
  3. articles_list=models.Article.objects.all()
  4. 使用articles_list,比如if articles_list,这时转换sql语句
  5.  
  6. 3、缓存机制
  7. articles_list=models.Article.objects.all()
  8. for i in articles_list
  9. print(i.title) # hit the database
  10.  
  11. for i in articles_list
  12. print(i.title) # not hit the database
  13.  
  14. ==============================================
  15. for i in models.Article.objects.all():
  16. print(i.title) # hit the database
  17.  
  18. for i in models.Article.objects.all():
  19. print(i.title) # hit the database
  20. 4、优化查询
  21. articles_list=models.Article.objects.all().iterator()
  22. for i in articles_list
  23. print(i.title) # hit the database
  24.  
  25. for i in articles_list
  26. print(i.title) # 无结果

连表操作:

表关系:

  1. class UserInfo(AbstractUser): # settings: AUTH_USER_MODEL = "blog.UserInfo"
  2. """
  3. 用户信息
  4. """
  5. nid = models.BigAutoField(primary_key=True)
  6. nickname = models.CharField(verbose_name='昵称', max_length=32,null=True)
  7. telephone = models.CharField(max_length=11, blank=True, null=True, unique=True, verbose_name='手机号码')
  8. avatar = models.FileField(verbose_name='头像', upload_to='avatar', default="avatar/default.png")
  9. create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
  10.  
  11. class Blog(models.Model):
  12. """
  13. 站点信息
  14. """
  15. nid = models.BigAutoField(primary_key=True)
  16. title = models.CharField(verbose_name='个人博客标题', max_length=64)
  17. site = models.CharField(verbose_name='个人博客后缀', max_length=32, unique=True)
  18. theme = models.CharField(verbose_name='博客主题', max_length=32)
  19.  
  20. user = models.OneToOneField(to='UserInfo', to_field='nid')
  21.  
  22. class Category(models.Model):
  23.  
  24. nid = models.AutoField(primary_key=True)
  25. title = models.CharField(verbose_name='分类标题', max_length=32)
  26. blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid')
  27.  
  28. class Article(models.Model):
  29. nid = models.BigAutoField(primary_key=True)
  30. title = models.CharField(max_length=50, verbose_name='文章标题')
  31. desc = models.CharField(max_length=255, verbose_name='文章描述')
  32.  
  33. # category字段: 与Article对象关联的category对象
  34. category = models.ForeignKey(verbose_name='文章类型', to='Category', to_field='nid', null=True)
  35.  
  36. # user字段:与Article对象关联的user字段
  37. user = models.ForeignKey(verbose_name='所属用户', to='UserInfo', to_field='nid')
  38.  
  39. # tags字段: 与Article对象关联的所有的标签对象集合
  40.  
  41. tags = models.ManyToManyField(
  42. to="Tag",
  43. through='Article2Tag',
  44. through_fields=('article', 'tag'),
  45. )
  46.  
  47. class ArticleDetail(models.Model):
  48.  
  49. nid = models.AutoField(primary_key=True)
  50. content = models.TextField(verbose_name='文章内容', )
  51.  
  52. article = models.OneToOneField(verbose_name='所属文章', to='Article', to_field='nid')
  53.  
  54. class Article2Tag(models.Model): # 中介模型
  55. nid = models.AutoField(primary_key=True)
  56. article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid')
  57. tag = models.ForeignKey(verbose_name='标签', to="Tag", to_field='nid')
  58.  
  59. class Tag(models.Model):
  60. nid = models.AutoField(primary_key=True)
  61. title = models.CharField(verbose_name='标签名称', max_length=32)
  62. blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid')

关联表的添加记录操作:

  1. 1、创建一篇文章对象:
  2. user_obj=models.UserInfo.objects.get(nid=1)
  3. category_obj=models.Category.objects.get(nid=2)
  4.  
  5. #################一对多关系绑定#########################
  6. # 方式1:
  7. article_obj=models.Article.objects.create(nid=5,title="招呼亚星"....,user=user_obj,category=category_obj)
  8.  
  9. # 方式2:
  10. article_obj=models.Article.objects.create(nid=5,title="招呼亚星"....,user_id=1,category_id=2)
  11. '''
  12. Article:
  13. nid title user_id category_id
  14. 5 招呼亚星 1 2
  15.  
  16. '''
  17. ############################多对多关系绑定#########################
  18. if 没有中介模型:
  19. tags = models.ManyToManyField("Tag")
  20. '''
  21. ORM创建的第三张表:
  22. Article2tags:
  23.  
  24. nid article_id tag_id
  25. 1 5 1
  26. 2 5 2
  27.  
  28. '''
  29.  
  30. 实例:给article_obj绑定kw1,kw2的标签
  31. tag1=Tag.objects.filter(title=kw1).first()
  32. tag2=Tag.objects.filter(title=kw2).first()
  33.  
  34. article_obj.tags.add(tag1,tag2) #
  35. article_obj.tags.add(*[tag1,tag2])
  36. article_obj.tags.add(1,2)
  37. article_obj.tags.add(*[1,2])
  38.  
  39. 解除关系:
  40. article_obj.tags.remove(tag1,tag2)
  41. article_obj.tags.clear()
  42.  
  43. 重置关系:
  44. article_obj.tags.clear()
  45. article_obj.tags.add(tag1,tag2)
  46. =====
  47. article_obj.tags.set(tag1,tag2)
  48.  
  49. if 有中介模型:
  50. tags = models.ManyToManyField(
  51. to="Tag",
  52. through='Article2Tag',
  53. through_fields=('article', 'tag'),
  54. )
  55.  
  56. class Article2Tag(models.Model): # 中介模型
  57. nid = models.AutoField(primary_key=True)
  58. article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid')
  59. tag = models.ForeignKey(verbose_name='标签', to="Tag", to_field='nid')
  60.  
  61. 绑定多对多的关系,有中介模型,不能再使用article_obj.tags.add(),remove()等方法;
  62. 只能用Article2Tag表进行实例对象。
  63.  
  64. 实例:给article_obj绑定kw1,kw2的标签:
  65.  
  66. models.Article2Tag.objects.create(tag_id=1,article_id=5)
  67. models.Article2Tag.objects.create(tag_id=2,article_id=5)

关联表的查询操作

基于对象查询(子查询):

  1. 一对多的查询:
  2.  
  3. 实例1:查询主键为4的文章的分类名称(正向查询,按字段)
  4.  
  5. article_obj=models.Article.objects.get(nid=4)
  6. print(article_obj.category.title)
  7.  
  8. SELECT * FROM "blog_article" WHERE "blog_article"."nid" = 4; // category_id=2
  9. SELECT * FROM "blog_category" WHERE "blog_category"."nid" = 2;
  10.  
  11. 实例2:查询用户yuan发表过的所有的文章(反向查询,表名_set)
  12. yuan=models.UserInfo.objects.get(username="yuan")
  13. book_list=yuan.article_set.all() # QuerySet
  14.  
  15. 多对多的查询:
  16.  
  17. 实例3:查询主键为4的文章的标签名称(正向查询,按字段)
  18. article_obj=models.Article.objects.get(nid=4)
  19. tag_list=article_obj.tags.all() # 是通过Article2Tag找到tag表中关联的tag记录
  20. for i in tag_list:
  21. print(i.title)
  22.  
  23. 实例4:查询web开发的这个标签对应的所有的文章(反向查询,按表名_set
  24. tag_obj=models.Tag.objects.get(title="web开发")
  25. article_list=tag_obj.article_set.all()
  26. for i in article_list:
  27. print(i.title)
  28.  
  29. 实例5:查询web开发的这个标签对应的所有的文章对应的作者名字
  30. tag_obj=models.Tag.objects.get(title="web开发")
  31. article_list=tag_obj.article_set.all()
  32. for article in article_list:
  33. print(article.user.username)

基于QuerySet跨表查询  正向查询,按字段 ;反向查询,按表名(join查询)

  1. 一对多的查询:
  2.  
  3. 实例1:查询主键为4的文章的分类名称
  4.  
  5. models.Article.objects.filter(nid=4).values("category__title")
  6. models.Category.objects.filter(article__nid=4).values("title")
  7.  
  8. 实例2:查询用户yuan发表过的所有的文章
  9. models.UserInfo.objects.filter(username="yuan").values(article__title)
  10. models.Article.objects.filter(user__username="yuan").values("title")
  11.  
  12. 多对多的查询:
  13.  
  14. 实例3:查询主键为4的文章的标签名称(正向查询,按字段)
  15. models.Article.objects.filter(nid=4).values("tags__title")
  16. models.Tag.objects.filter(article__nid=4).values("title")
  17.  
  18. 实例4:查询web开发的这个标签对应的所有的文章(反向查询,按表名_set
  19. models.Article.objects.filter(tags__title="web开发").values("title")
  20. models.Tag.objects.filter(title="web开发").values("article__title")
  21.  
  22. 实例5:查询web开发的这个标签对应的所有的文章对应的作者名字
  23. models.Tag.objects.filter(title="web开发").values("article__user__username")
  24. models.UserInfo.objects.filter(article__tags__title="web开发").values("username")

聚合查询与分组查询:

  1. 聚合查询:
  2. # 查询所有书籍的平均价格
  3. Book.objects.all().aggregate(Avg('price'))

  4. 分组查询:
  5. #查询每一个出版社出版过的名字以及出版书籍个数
  6. sql select publish.name,Count(book.name) from Book inner join publish on book.pub_id=publish.id group by publish.name

django之整体复习的更多相关文章

  1. Django框架(三) 复习总结与路由控制

    知识点回顾 MTV模型 model:模型,和数据库相关的 template:模板,存放html文件,模板语法(目的是将变量如何巧妙的嵌入到HTML页面中). views:视图函数 另加urls:url ...

  2. 入门大数据---Spark整体复习

    一. Spark简介 1.1 前言 Apache Spark是一个基于内存的计算框架,它是Scala语言开发的,而且提供了一站式解决方案,提供了包括内存计算(Spark Core),流式计算(Spar ...

  3. 搭建django

    虚拟环境配置 pip install virtualenv 一般需要安装一个管理工具:pip install virtualenvwrapper-win 只有它可以使用workon 创建虚拟环境:mk ...

  4. Django&Flask区别

    Flask Flask 本身只有一个内核,几乎所有的功能都需要用第三方的扩展来实现. Flask 没有默认使用的数据库,默认依赖两个外部库:Jinja2 模板引擎和 WSGI 工具箱(采用的时 Wer ...

  5. Django【进阶篇】

    目录 一.Model 二.admin 三.Form组件 四.Cookie 五.Session 六.分页 七.序列化 一.Model 数据库的配置 1.django默认支持sqlite,mysql, o ...

  6. django和flask的区别

    转载至https://blog.csdn.net/tulan_xiaoxin/article/details/79132214 (1)Flask Flask确实很“轻”,不愧是Micro Framew ...

  7. Flask 和 Django 框架的区别

    1)Flask Flask确实很“轻”,不愧是Micro Framework,从Django转向Flask的开发者一定会如此感慨,除非二者均为深入使用过 Flask自由.灵活,可扩展性强,第三方库的选 ...

  8. 测试开发中Django和Flask框架

    Python测试开发中Django和Flask框架 为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应用.系统应用)跟建造房子的过程一样,需要先打地基,搭好骨架,然后 ...

  9. 论Flaks与Django的区别

    1. jiaji2和DjangoTemplates模板引擎相比,jiaja2语法更简单 2. 耦合 3. 模型 3.1 模型定义 3.2 模型数据查询 Django: 自带ORM(Object-Rel ...

随机推荐

  1. IOS批量截取视频截图 UIImage mp4 IOS Video

    IOS批量截取视频截图 //生成截图 NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents&quo ...

  2. Android Studio如何集成Genymotion

    转自:http://blog.csdn.net/hyr83960944/article/details/37900383 Android Studio集成Genymotion比在Eclipse中集成简 ...

  3. .net 导出带条码的PDF

    Nuget添加引用:ZXing.Net生成条形码,ZXing.Net.Bindings.ImageSharp生成图片 将图片流插入单元格 举个栗子: BarcodeWriter writer = ne ...

  4. STL iterator和reverse_iterator

    先看一段代码: #include <iostream> #include <deque> #include <algorithm> #include <ite ...

  5. 进度对话框 ProgressDialog 用法总结

    ProgressDialog 继承自AlertDialog,AlertDialog继承自Dialog );         dialog.setButton(DialogInterface.BUTTO ...

  6. linux 的空命令:(冒号)

    php里面又“空操作”这个东西,于是想一想linux的命令中是否有“空命令”这种东西,搜索一下,结果发现真的有这个东西存在 -------:) 冒号 : 就是空命令.即什么也不做,是一个命令占位符 # ...

  7. 【转】vim折叠功能

    原文:https://www.yupengsir.com/topic/content?i=140 这个作者的vim系列是高级的用法, 要学习一下. https://blog.easwy.com/arc ...

  8. 如何判断linux用户是否为root用户

    看命令行提示符 ,如果是#,那就是root用户,如下图:[root@localhost /]# 如果是$,那就是普通用户,如下图:[test@localhost ~]$

  9. 利用Nginx搭建http和rtmp协议的流媒体服务器[转]

    利用nginx搭建http和rtmp协议的流媒体服务器 实验目的:让Nginx支持flv和mp4格式文件,同时支持Rtmp协议:同时打开rtmp的hls功能资料:HTTPLive Streaming( ...

  10. [ACM] ZOJ Martian Addition (20进制的两个大数相加)

    Martian Addition Time Limit: 2 Seconds      Memory Limit: 65536 KB   In the 22nd Century, scientists ...