Django学习笔记

  1. create project
    $ django-admin startproject blogproject
    $ cd blogproject
    $ tree
         manage.py 
         blogproject/
         __init__.py 
         settings.py 
         urls.py 
         wsgi.py
    
  2. 修改Django 默认的语言,缺省是英语
    blogproject/settings.py
    ## 其它配置代码... 
    LANGUAGE_CODE = 'zh-hans'  #default value is en-us
    TIME_ZONE = 'Asia/Shanghai' #default value is UTC
    ## 其它配置代码...
    
  3. start django server
    python manage.py runserver 8000 #start server at 8000 port
    
  4. create application
    $ python manage.py startapp blog
    ##目录结构如下:
    blog/
        __init__.py
        admin.py 
        apps.py 
        migrations/
                __init__.py 
        models.py 
        tests.py 
        views.py
    
  1. 注册blog应用
    修改blogproject目录下的 settings.py 文件,找到 INSTALLED_APPS 设置项,将 blog 应用添加进去。
    ## 其他配置项... 
    INSTALLED_APPS = [
      'django.contrib.admin',
      'django.contrib.auth', 
      'django.contrib.contenttypes',  
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles', 
      'blog',  # 注册 blog 应用,注意行尾逗号
    ] 
    ## 其他配置项...
    
    6.创建应用数据库表结构
    `
    blog/models.py

from django.db import models
from django.contrib.auth.models import User

class Category(models.Model):
“”” Django 要求模型必须继承 models.Model 类。 Category 只需要一个简单的分类名 name 就可以了。 CharField 指定了分类名 name 的数据类型,CharField 是字符型, CharField 的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。 当然 Django 还为我们提供了多种其它的数据类型,如日期时间类型 DateTimeField、整数类型 IntegerField 等等。 Django 内置的全部类型可查看文档: https://docs.djangoproject.com/en/1.10/ref/models/fields/#field-types “””
name = models.CharField(max_length=100)

class Tag(models.Model):
“”” 标签 Tag 也比较简单,和 Category 一样。 再次强调一定要继承 models.Model 类! “””
name = models.CharField(max_length=100)

class Post(models.Model): “
“” 文章的数据库表稍微复杂一点,主要是涉及的字段更多。 “””

# 文章标题 
title = models.CharField(max_length=70) 

# 文章正文,我们使用了 TextField。 # 存储比较短的字符串可以使用 CharField,但对于文章的正文来说可能会是一大段文本,因此使用 TextField 来存储大段文本。 
body = models.TextField() 

# 这两个列分别表示文章的创建时间和最后一次修改时间,存储时间的字段用 DateTimeField 类型。 
created_time = models.DateTimeField()   
modified_time = models.DateTimeField() 

# 文章摘要,可以没有文章摘要,但默认情况下 CharField 要求我们必须存入数据,否则就会报错。 # 指定 CharField 的 blank=True 参数值后就可以允许空值了。 
excerpt = models.CharField(max_length=200, blank=True) 
# 这是分类与标签,分类与标签的模型我们已经定义在上面。 
# 我们在这里把文章对应的数据库表和分类、标签对应的数据库表关联了起来,但是关联形式稍微有点不同。 
# 我们规定一篇文章只能对应一个分类,但是一个分类下可以有多篇文章,所以我们使用的是 ForeignKey,即一对多的关联关系。 
# 而对于标签来说,一篇文章可以有多个标签,同一个标签下也可能有多篇文章,所以我们使用 ManyToManyField,表明这是多对多的关联关系。
# 同时我们规定文章可以没有标签,因此为标签 tags 指定了 blank=True。 
# 如果你对 ForeignKey、ManyToManyField 不了解,请看教程中的解释,亦可参考官方文档:
# https://docs.djangoproject.com/en/1.10/topics/db/models/#relationships 
category = models.ForeignKey(Category)
 tags = models.ManyToManyField(Tag, blank=True) 

文章作者,这里 User 是从 django.contrib.auth.models 导入的。

django.contrib.auth 是 Django 内置的应用,专门用于处理网站用户的注册、登录等流程,User 是 Django 为我们已经写好的用户模型。 # 这里我们通过 ForeignKey 把文章和 User 关联了起来。

因为我们规定一篇文章只能有一个作者,而一个作者可能会写多篇文章,因此这是一对多的关联关系,和 Category 类似。

 author = models.ForeignKey(User)
7. 生成数据库表结构
切换到 manage.py 文件所在的目录下,分别运行 `python manage.py makemigrations` 和 `python manage.py migrate `命令
默认的数据库引擎就是使用的 SQLite3,

blogproject/settings.py

其它配置选项…

DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.sqlite3’,
‘NAME’: os.path.join(BASE_DIR, ‘db.sqlite3’),
}
}

其它配置选项…

>如需使用其它数据库引擎,请自行Google用法。
数据库的增删改查

$ python manage.py createsuperuser #create user
$ python manage.py shell

#新增数据

from blog.models import Category, Tag, Post
from django.utils import timezone
from django.contrib.auth.models import User

#add category and tag

c = Category(name=’category test’)
c.save()
t = Tag(name=’tag test’)
t.save()

add post

user = User.objects.get(username=’myuser’)
c = Category.objects.get(name=’category test’)
p = Post(title=’title test’, body=’body test’, created_time=timezone.now(), modified_time=timezone.now(), category=c, author=user)
p.save()

#read data

Category.objects.all()

<QuerySet [<Category: Category object>]>

Tag.objects.all() <QuerySet [<Tag: Tag object>]>
Post.objects.all() <QuerySet [<Post: Post object>]>

`

-------------the end-------------