创建django项目
在pycharm中创建django项目时,同时生成新的虚拟环境,选择相应的python版本。创建完后在,可以查看当前的django版本,和已经安装的模块。
目录说明:
- djangodemo: 项目的容器。
- manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
- init.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
- asgi.py: 一个 ASGI 兼容的 Web 服务器的入口,以便运行你的项目。
- settings.py: 该 Django 项目的设置/配置。
- urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站”目录”。
- wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
运行项目
进入项目的根目录,在终端中运行python3 manage.py runserver
默认IP:127.0.0.1,默认端口:8000,弱国需要修改可以在runserve后面直接跟上IP空格端口号。
在浏览器输入:127.0.0.1:8000就可以进入django的主页。
创建app
django中使用app来划分功能模块,一个app是一个python包,通过命令来生成app:
python manage.py startapp djangodemo(app名)

app目录:
migrations:用来存放数据库迁移文件,数据库表的修改会记录在这个包中。
admin.py:后台管理类
apps.py:app类
models.py:模型类,用来与数据库做ORM映射和进行数据库的操作。
views.py:试图函数,逻辑处理
app生成后需要在项目中激活,在项目目录djangodemo中的setting配置文件的INSTALLED_APPS中添加应用:
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','cruddemo', # 激活应用]
配置数据库
django默认数据库是sqllite,使用MySQL时需要在项目目录djangodemo中修改setting配置文件DATABASES。
配置如下:
DATABASES = {'default': {#'ENGINE': 'django.db.backends.sqlite3',#'NAME': BASE_DIR / 'db.sqlite3','ENGINE': 'django.db.backends.mysql','NAME': 'djangodemo', # 数据库名'USER': 'root', # 用户名'PASSWORD': '123456', # 密码'HOST': '127.0.0.1','PORT': '3306',}}
另外在项目目录djangodemo中的init.py文件中导入pymysql
import pymysqlpymysql.install_as_MySQLdb()
创建模型类
在curddemo应用的model.py文件中定义模型类,需要继承Model类,Model类中有对象操作的方法,可以直接与数据库交互。
from django.db import modelsimport datetimeclass book(models.Model):"""book model"""id = models.AutoField(primary_key=True)book_name = models.CharField(max_length=50)pub_data = models.DateField()
数据表迁移
生成数据表迁移文件,在终端执行命令:
python manage.py makemigrations app_name #不加app_name时为全局生成
执行迁移,在数据库生成模型相应的表,终端执行命令:
python manage.py migrate app_name #不加app_name时为全局生成
crud操作
在终端执行 python manage.py shell 命令进入命令行模式,在命令行模式导入模型类后可以使用命令行模式来对数据库进行crud操作。
>>> from cruddemo.models import book>>> import datetime>>> b = book()>>> b.book_name = 'java'>>> b.pub_data = datetime.date(2019,10,3)>>> b.save() #保存数据到数据库>>> res = book.objects.all() #查询所有记录>>> print(res)<QuerySet [<book: book object (1)>, <book: book object (2)>]> #手动在数据库中添加了一条数据>>> print(book.objects.get(id=2))book object (2)>>> b2 = book.objects.get(id=2) #根据id来查记录>>> type(b2)<class 'cruddemo.models.book'>>>> b2.book_name'java'>>> b2.pub_datadatetime.date(2019, 10, 3)>>> b2.delete() #删除记录(1, {'cruddemo.book': 1})>>> print(book.objects.all())<QuerySet [<book: book object (1)>]>>>> b.book_name = 'python web'>>> b.save()>>> print(book.objects.get(id=1).book_name)python>>> upb2 = book.objects.get(id=2)>>> print(upb2.book_name)python web>>> upb2.book_name = 'django'>>> upb2.save() #修改记录的值>>> print(book.objects.get(id=2).book_name)django
关联查询
有book和author两个关联表,book的主键关联author的外键。
from django.db import modelsimport datetime# Create your models here.class book(models.Model):"""book model"""id = models.AutoField(primary_key=True)book_name = models.CharField(max_length=50)pub_data = models.DateField()class author(models.Model):"""author model"""id = models.AutoField(primary_key=True)name = models.CharField(max_length=50)comment = models.CharField(max_length=128)# 外键的关联字段hbook = models.ForeignKey(to='book',on_delete=models.PROTECT)
to:为关联的对象名
on_delete:jango2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题。
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
- CASCADE:此值设置,是级联删除。
- PROTECT:此值设置,是会报完整性错误。
- SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
- SET_DEFAULT:此值设置,会把设置为外键的默认值。
- SET():此值设置,会调用外面的值,可以是一个函数。
一般情况下使用CASCADE就可以了。
models.py修改后按照表迁移的操作,将表更新到数据库中。
>>> from cruddemo.models import book,author>>> import datetime>>> b = book.objects.get(id=1)>>> a = author()>>> a.name = 'orange'>>> a.comment = 'python small white'>>> a.hbook = b #外键字段使用关联对象来赋值>>> a.save()>>> print(author.objects.all())<QuerySet [<author: author object (1)>]>>>> b = author()>>> b.name = 'apple'>>> b.comment = 'good at python'>>> b.hbook = book.objects.get(id=1)>>> b.save()>>> author.objects.all()<QuerySet [<author: author object (1)>, <author: author object (2)>]>>>> fb = book.objects.get(id=1)>>> fb.author_set.all() #关联查询<QuerySet [<author: author object (1)>, <author: author object (2)>]>>>> for a in fb.author_set.all():... print(a.name)...orangeapple
