创建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 pymysql
pymysql.install_as_MySQLdb()
创建模型类
在curddemo应用的model.py文件中定义模型类,需要继承Model类,Model类中有对象操作的方法,可以直接与数据库交互。
from django.db import models
import datetime
class 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_data
datetime.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 models
import 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)
...
orange
apple