<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Django on My Blog</title><link>/tags/django/</link><description>Recent content in Django on My Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 12 Feb 2017 00:00:00 +0000</lastBuildDate><atom:link href="/tags/django/index.xml" rel="self" type="application/rss+xml"/><item><title>django的使用3-编写视图</title><link>/2017/02/12/django%E7%9A%84%E4%BD%BF%E7%94%A83-%E7%BC%96%E5%86%99%E8%A7%86%E5%9B%BE/</link><pubDate>Sun, 12 Feb 2017 00:00:00 +0000</pubDate><guid>/2017/02/12/django%E7%9A%84%E4%BD%BF%E7%94%A83-%E7%BC%96%E5%86%99%E8%A7%86%E5%9B%BE/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id="编写视图"&gt;编写视图&lt;/h1&gt;
&lt;p&gt;一个视图函数（或简称为视图）是一个 Python 函数，它接受 Web 请求并返回一个 Web 响应。这个响应可以是 Web 页面的 HTML 内容，或者重定向，或者404错误，或者 XML 文档，或一个图片&amp;hellip;或是任何内容。视图本身包含返回响应所需的任何逻辑。这个代码可以存在任何地方，只要它在你的 Python 路径上就行。可以说，不需要其他东西，这里并没有魔法。为了将代码放置在某处，约定将视图放在名为 &lt;code&gt;views.py&lt;/code&gt; 的文件里，这个文件放置在项目或应用目录里。&lt;/p&gt;
&lt;h2 id="一个简单的视图"&gt;一个简单的视图&lt;/h2&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/"&gt;https://docs.djangoproject.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>django的使用3-URL调度器</title><link>/2017/02/10/django%E7%9A%84%E4%BD%BF%E7%94%A83-url%E8%B0%83%E5%BA%A6%E5%99%A8/</link><pubDate>Fri, 10 Feb 2017 00:00:00 +0000</pubDate><guid>/2017/02/10/django%E7%9A%84%E4%BD%BF%E7%94%A83-url%E8%B0%83%E5%BA%A6%E5%99%A8/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;Django 允许你自由地设计你的URL，不受框架束缚。&lt;/p&gt;
&lt;h2 id="概况"&gt;概况&lt;/h2&gt;
&lt;p&gt;对于高质量的Web 应用来说，使用简洁、优雅的URL 模式是一个非常值得重视的细节。&lt;/p&gt;
&lt;p&gt;为了给一个应用设计URL，你需要创建一个Python 模块，通常被称为&lt;strong&gt;URLconf&lt;/strong&gt;(URL configuration)。这个模块是纯粹的Python 代码，包含URL 模式(简单的正则表达式)到Python 函数(你的视图)的简单映射。&lt;/p&gt;
&lt;p&gt;映射可短可长，随便你。它可以引用其它的映射。而且，因为它是纯粹的Python 代码，它可以动态构造。&lt;/p&gt;
&lt;h2 id="django-如何处理一个请求"&gt;Django 如何处理一个请求&lt;/h2&gt;
&lt;p&gt;当一个用户请求Django 站点的一个页面，下面是Django 系统决定执行哪个Python 代码使用的算法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Django 确定使用根 URLconf 模块。通常，这是 ROOT_URLCONF 设置的值，但如果传入 HttpRequest 对象拥有 urlconf 属性（通过中间件设置），它的值将被用来代替 ROOT_URLCONF 设置。&lt;/li&gt;
&lt;li&gt;Django 加载该 Python 模块并寻找可用的 urlpatterns 。它是 django.urls.path() 和(或) django.urls.re_path() 实例的序列(sequence)。&lt;/li&gt;
&lt;li&gt;Django 会按顺序遍历每个 URL 模式，然后会在所请求的URL匹配到第一个模式后停止，并与 path_info 匹配。&lt;/li&gt;
&lt;li&gt;一旦有 URL 匹配成功，Djagno 导入并调用相关的视图，这个视图是一个Python 函数（或基于类的视图 class-based view ）。视图会获得如下参数：
&lt;ul&gt;
&lt;li&gt;一个 HttpRequest 实例。&lt;/li&gt;
&lt;li&gt;如果匹配的 URL 包含未命名组，那么来自正则表达式中的匹配项将作为位置参数提供。&lt;/li&gt;
&lt;li&gt;关键字参数由路径表达式匹配的任何命名部分组成，并由 django.urls.path() 或 django.urls.re_path() 的可选 kwargs 参数中指定的任何参数覆盖。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果没有 URL 被匹配，或者匹配过程中出现了异常，Django 会调用一个适当的错误处理视图。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="实例"&gt;实例&lt;/h2&gt;
&lt;p&gt;下面是一个简单的 URLconf:&lt;/p&gt;</description></item><item><title>django的使用3-聚合</title><link>/2017/02/07/django%E7%9A%84%E4%BD%BF%E7%94%A83-%E8%81%9A%E5%90%88/</link><pubDate>Tue, 07 Feb 2017 00:00:00 +0000</pubDate><guid>/2017/02/07/django%E7%9A%84%E4%BD%BF%E7%94%A83-%E8%81%9A%E5%90%88/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id="聚合"&gt;聚合&lt;/h1&gt;
&lt;p&gt;Django 数据库抽象 API 描述了使用 Django queries 来增删查改单个对象的方法。 然而，有时候你要获取的值需要根据一组对象聚合后才能得到。&lt;/p&gt;
&lt;p&gt;模型示例： 作者，出版社，书，商店。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
class Publisher(models.Model):
name = models.CharField(max_length=300)
class Book(models.Model):
name = models.CharField(max_length=300)
pages = models.IntegerField()
price = models.DecimalField(max_digits=10, decimal_places=2)
rating = models.FloatField()
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
pubdate = models.DateField()
class Store(models.Model):
name = models.CharField(max_length=300)
books = models.ManyToManyField(Book)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="常见的聚合查询"&gt;常见的聚合查询&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h4 id="expressions"&gt;&lt;code&gt;expressions&lt;/code&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4 id="output_field"&gt;&lt;code&gt;output_field&lt;/code&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4 id="filter"&gt;&lt;code&gt;filter&lt;/code&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4 id="avg"&gt;&lt;code&gt;Avg&lt;/code&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4 id="count"&gt;&lt;code&gt;Count&lt;/code&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4 id="max"&gt;&lt;code&gt;Max&lt;/code&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4 id="min"&gt;&lt;code&gt;Min&lt;/code&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4 id="sum"&gt;&lt;code&gt;Sum&lt;/code&gt;&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4 id="variance-返回给定表达式中数据的方差"&gt;&lt;code&gt;Variance&lt;/code&gt;： 返回给定表达式中数据的方差&lt;/h4&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4 id="stddev-返回给定表达式中数据的标准差"&gt;&lt;code&gt;StdDev&lt;/code&gt;： 返回给定表达式中数据的标准差&lt;/h4&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# Total number of books.
&amp;gt;&amp;gt;&amp;gt; Book.objects.count()
2452
# Total number of books with publisher=BaloneyPress
&amp;gt;&amp;gt;&amp;gt; Book.objects.filter(publisher__name=&amp;#39;BaloneyPress&amp;#39;).count()
73
# Average price across all books.
&amp;gt;&amp;gt;&amp;gt; from django.db.models import Avg
&amp;gt;&amp;gt;&amp;gt; Book.objects.all().aggregate(Avg(&amp;#39;price&amp;#39;))
{&amp;#39;price__avg&amp;#39;: 34.35}
# Max price across all books.
&amp;gt;&amp;gt;&amp;gt; from django.db.models import Max
&amp;gt;&amp;gt;&amp;gt; Book.objects.all().aggregate(Max(&amp;#39;price&amp;#39;))
{&amp;#39;price__max&amp;#39;: Decimal(&amp;#39;81.20&amp;#39;)}
# Difference between the highest priced book and the average price of all books.
&amp;gt;&amp;gt;&amp;gt; from django.db.models import FloatField
&amp;gt;&amp;gt;&amp;gt; Book.objects.aggregate(
... price_diff=Max(&amp;#39;price&amp;#39;, output_field=FloatField()) - Avg(&amp;#39;price&amp;#39;))
{&amp;#39;price_diff&amp;#39;: 46.85}
# All the following queries involve traversing the Book&amp;lt;-&amp;gt;Publisher
# foreign key relationship backwards.
# Each publisher, each with a count of books as a &amp;#34;num_books&amp;#34; attribute.
&amp;gt;&amp;gt;&amp;gt; from django.db.models import Count
&amp;gt;&amp;gt;&amp;gt; pubs = Publisher.objects.annotate(num_books=Count(&amp;#39;book&amp;#39;))
&amp;gt;&amp;gt;&amp;gt; pubs
&amp;lt;QuerySet [&amp;lt;Publisher: BaloneyPress&amp;gt;, &amp;lt;Publisher: SalamiPress&amp;gt;, ...]&amp;gt;
&amp;gt;&amp;gt;&amp;gt; pubs[0].num_books
73
# Each publisher, with a separate count of books with a rating above and below 5
&amp;gt;&amp;gt;&amp;gt; from django.db.models import Q
&amp;gt;&amp;gt;&amp;gt; above_5 = Count(&amp;#39;book&amp;#39;, filter=Q(book__rating__gt=5))
&amp;gt;&amp;gt;&amp;gt; below_5 = Count(&amp;#39;book&amp;#39;, filter=Q(book__rating__lte=5))
&amp;gt;&amp;gt;&amp;gt; pubs = Publisher.objects.annotate(below_5=below_5).annotate(above_5=above_5)
&amp;gt;&amp;gt;&amp;gt; pubs[0].above_5
23
&amp;gt;&amp;gt;&amp;gt; pubs[0].below_5
12
# The top 5 publishers, in order by number of books.
&amp;gt;&amp;gt;&amp;gt; pubs = Publisher.objects.annotate(num_books=Count(&amp;#39;book&amp;#39;)).order_by(&amp;#39;-num_books&amp;#39;)[:5]
&amp;gt;&amp;gt;&amp;gt; pubs[0].num_books
1323
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="aggregate"&gt;aggregate&lt;/h2&gt;
&lt;p&gt;Django 提供了两种生成聚合的方法。第一种方法是从整个 &lt;code&gt;QuerySet&lt;/code&gt; 生成汇总值。比如你想要计算所有在售书的平均价格。Django 的查询语法提供了一种用来描述所有图书集合的方法：&lt;/p&gt;</description></item><item><title>django的使用3-数据库抽象API</title><link>/2017/02/05/django%E7%9A%84%E4%BD%BF%E7%94%A83-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8A%BD%E8%B1%A1api/</link><pubDate>Sun, 05 Feb 2017 00:00:00 +0000</pubDate><guid>/2017/02/05/django%E7%9A%84%E4%BD%BF%E7%94%A83-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8A%BD%E8%B1%A1api/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id="数据库抽象api"&gt;数据库抽象API&lt;/h1&gt;
&lt;p&gt;一旦创建数据模型后，Django 自动给予你一套数据库抽象 API，允许你创建，检索，更新和删除对象。下面介绍这些API。&lt;/p&gt;
&lt;p&gt;先创建三个模型：博客，作者，记录&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=200)
email = models.EmailField()
def __str__(self):
return self.name
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
number_of_comments = models.IntegerField()
number_of_pingbacks = models.IntegerField()
rating = models.IntegerField()
def __str__(self):
return self.headline
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="创建新数据"&gt;创建新数据&lt;/h2&gt;
&lt;p&gt;一个模型类代表一张数据表，一个模型类的实例代表数据库表中的一行记录。要创建一个对象，用关键字参数初始化它，然后调用 save() 将其存入数据库。&lt;/p&gt;</description></item><item><title>django的使用2-模型</title><link>/2017/02/01/django%E7%9A%84%E4%BD%BF%E7%94%A82-%E6%A8%A1%E5%9E%8B/</link><pubDate>Wed, 01 Feb 2017 00:00:00 +0000</pubDate><guid>/2017/02/01/django%E7%9A%84%E4%BD%BF%E7%94%A82-%E6%A8%A1%E5%9E%8B/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h2 id="模型"&gt;模型&lt;/h2&gt;
&lt;p&gt;模型准确且唯一的描述了数据。它包含您储存的数据的重要字段和行为。一般来说，每一个模型都映射一张数据库表。有如下几个点:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个模型都是一个 Python 的类，这些类继承 django.db.models.Model&lt;/li&gt;
&lt;li&gt;模型类的每个属性都相当于一个数据库的字段。&lt;/li&gt;
&lt;li&gt;利用这些，Django 提供了一个自动生成访问数据库的 API；&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="example"&gt;example&lt;/h3&gt;
&lt;p&gt;定义了一个 Person 模型，拥有 first_name 和 last_name:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;first_name 和 last_name 是模型的 字段。每个字段都被指定为一个类属性，并且每个属性映射为一个数据库列。&lt;/p&gt;
&lt;p&gt;上面的 Person 模型会创建一个如下的数据库表：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CREATE TABLE myapp_person (
&amp;#34;id&amp;#34; serial NOT NULL PRIMARY KEY,
&amp;#34;first_name&amp;#34; varchar(30) NOT NULL,
&amp;#34;last_name&amp;#34; varchar(30) NOT NULL
);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;该表的名称规则 myapp_person = app名称_class名称，可修改。
id 字段会被自动添加，可修改。
创建数据表的语法是根据配置文件setting.py中设置的数据类型来定。&lt;/p&gt;
&lt;h3 id="字段类型"&gt;字段类型&lt;/h3&gt;
&lt;p&gt;模型中每一个字段都应该是某个 Field 类的实例， Django 利用这些字段类来实现以下功能：&lt;/p&gt;</description></item><item><title>django的使用1-简介</title><link>/2017/01/30/django%E7%9A%84%E4%BD%BF%E7%94%A81-%E7%AE%80%E4%BB%8B/</link><pubDate>Mon, 30 Jan 2017 00:00:00 +0000</pubDate><guid>/2017/01/30/django%E7%9A%84%E4%BD%BF%E7%94%A81-%E7%AE%80%E4%BB%8B/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id="简介"&gt;简介&lt;/h1&gt;
&lt;p&gt;Django 是一个用python语言写的&lt;strong&gt;web开发框架&lt;/strong&gt;，最初被设计用于具有快速开发需求的新闻类站点，目的是要实现简单快捷的网站开发。
著名的MVC模式：所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层；他们之间以一种插件似的，松耦合的方式连接在一起。&lt;/p&gt;
&lt;p&gt;模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面)，控制器(C)接受用户的输入调用模型和视图完成用户的请求。&lt;/p&gt;
&lt;p&gt;Django的MTV模式本质上与MVC模式没有什么差别，也是各组件之间为了保持松耦合关系，只是定义上有些许不同，Django的MTV分别代表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Model(模型)：负责业务对象与数据库的对象(ORM)&lt;/li&gt;
&lt;li&gt;Template(模版)：负责如何把页面展示给用户&lt;/li&gt;
&lt;li&gt;View(视图)：负责业务逻辑，并在适当的时候调用Model和Template&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此外，Django还有一个url分发器，它的作用是将一个个URL的页面请求分发给不同的view处理，view再调用相应的Model和Template&lt;/p&gt;
&lt;h2 id="django安装与基本使用"&gt;Django安装与基本使用&lt;/h2&gt;
&lt;h3 id="django安装"&gt;Django安装&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pip install django
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="创建项目"&gt;创建项目&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;django-admin startproject your-project-name
# example -----------------------------------------------------------
(dj) alex@Alex:~/github$ django-admin startproject my_project
(dj) alex@Alex:~/github$ tree my_project
my_project
├── manage.py
└── my_project
├── asgi.py
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这些目录和文件的用处是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;manage.py: 一个让你用各种方式管理 Django 项目的命令行工具&lt;/li&gt;
&lt;li&gt;my_project/ 目录包含你的项目，它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。&lt;/li&gt;
&lt;li&gt;my_project/&lt;strong&gt;init&lt;/strong&gt;.py：一个空文件，告诉 Python 这个目录应该被认为是一个 Python 包。&lt;/li&gt;
&lt;li&gt;my_project/settings.py：Django 项目的配置文件。&lt;/li&gt;
&lt;li&gt;my_project/urls.py：Django 项目的 URL 声明，路由配置。&lt;/li&gt;
&lt;li&gt;my_project/asgi.py：作为你的项目的运行在 ASGI 兼容的 Web 服务器上的入口。&lt;/li&gt;
&lt;li&gt;my_project/wsgi.py：作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="创建应用"&gt;创建应用&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;python manage.py startapp app01
# example -----------------------------------------------------------
(dj) alex@Alex:~/github$ cd my_project
(dj) alex@Alex:~/github/my_project$ ls
manage.py my_project
(dj) alex@Alex:~/github/my_project$ python manage.py startapp app01
(dj) alex@Alex:~/github/my_project$ tree
.
├── app01
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── my_project
├── asgi.py
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="启动项目"&gt;启动项目&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;python manage.py runserver
# example -----------------------------------------------------------
(dj) alex@Alex:~/github/my_project$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这里省略了host 和port的设置。&lt;code&gt;python manage.py runserver 0.0.0.0:8000&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>