Django基础
徐徐 抱歉选手

项目执行命令

runserver

python manage.py runserver:在本地查看项目。

superadmin

python manage.py createsuperuser建立superuser,有权限访问所有后台数据。

startapp

python manage.py startapp app-name:在当前总项目的项目文件夹新建一个application,django会自动生成一系列初始文件。如下所示。

image-20210211211655708

__init__.py为空。

admin.py用于注册models.py中的数据库的表,让数据库的操作不再依赖于shell中的代码,而是通过GUI操作。

apps.py说明一些和当前app相关的信息,比如在startapp后面跟着的app-name。

models.py用于建立数据库表,一般形式是声明一个class代表一个表,所有数据的类型定义都来自于from django.db import models库。如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


# Create your models here.
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)

def __str__(self):
return self.title

urls.py决定当前app的路由,和views.py的内容相关联。path('about/', views.about, name='blog-about')第一个参数是路由路径,第二个参数是views.py中定义的页面,第三个参数是赋予页面的唯一的名称,由这个页面名称可以反向获得页面路径。django中的路由解析是按照分级解析来运行的。在django_project的根目录的下一级同名子目录中可以发现另一个urls.py,这是路径搜索的开始,遇到匹配的就一级一级向其他app延伸。搜索结束django_project中的urls.py后,继续去掉已经搜索的url部分,匹配blog中的urls.py,直到匹配到特定的视图。

image-20210211212619133

views.py中,每一个视图/页面/组件,都以class的形式被声明,并通过from django.shortcuts import render的render函数返回。需要为render函数传入templates文件夹中的html页面,以及models.py中的数据,如return render(request, 'blog/about.html', {'title': 'About'})

image-20210211213119932

migration

为什么需要database migration?

这让我们在建立一个数据库之后,就算数据库中已经存在数据,我们依然能够修改数据库。如果django项目组没有database migration,而我们有需要对数据库的数据修改,我们需要使用一些sql code去update data structure。

相当于用python的方式去update sql。

python manage.py makemigrations基于项目中models.py的内容变化准备数据库同步,每一次执行makemigrations后migrations文件夹中都会生成XXXX_initial.py,这个文件只在makemigrations的时候生成。(这里的XXXX。是每一次migrations的数字,migration number)

image-20210211213738432

python manage.py migrate将已有的变化同步到数据库,主要就是执行makemigrations的时候生成的XXXX_initial.py文件。

image-20210211214453465

python manage.py sqlmigrate app-name migration-number会自动生成并显示每一次migration会生成的具体的sql代码。

image-20210211214423260

shell

python manage.py shell可以提供一个python prompt让我们用python的方式去查询数据库。

首先需要导入数据库中的表。在这里通过from django.contrib.auth.models import User导入User Table。其次,为了查询User Table中的各个项目,使用点访问法找出其内容User.objects。需要注意查询返回的是一个单个的对象,还是包含对象的集合QuerySet。

image-20210211214951351

为已经导入的表新建一个元组/插入一条新的数据,直接把导入的Table当作函数调用,并传入参数。每一次新建的一个元组都要保存到表才可以查询并显示。

image-20210211215405760

如何探寻多个表之间的关系?比如上面就是一个User Table,一个Post Table。我们希望找到一个用户发布的所有帖子,该怎么做?这在数据库查询中十分常见。在python shell中,可以直接使用user.post_set,它会返回一个可查询对象,继续对该对象使用all/first/last/filter等查询语句即可返回具体的内容。另外,还可以对该查询对象进行create操作,意思是为该用户新建一条帖子。

image-20210211220037732

  • 本文标题:Django基础
  • 本文作者:徐徐
  • 创建时间:2021-02-11 21:13:05
  • 本文链接:https://machacroissant.github.io/2021/02/11/django-basics/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论