1、创建项目
django-admin startproject my_first_django # 创建一个名称为my_first_django的项目
命令执行后会产生一个项目名称的文件夹和一个manage.py 文件
manage.py是项目的管理文件。
my_first_django中的结构如下:
Django 开发中一个功能模块用一个应用来实现
2、创建一个应用
python manage.py startapp booktest # 创建一个booktest的应用
应用创建好了以后需要进行注册
修改my_first_django中的setting.py 文件中的INSTALLED_APPS配置项。
运行django的web服务
python manage.py runserver
ORM (Object-Relations-Mapping)简介 ,Django默认内置了ORM框架
3、创建一个图书模型
from django.db import models
# Create your models here.
# 设计和表对应的类 : 模型类
# 图书类
class BookInfo(models.Model):
"""
图书模型类
"""
bname = models.CharField(max_length=20)
bpub_data = models.DateField()
Django会根据模型类在数据库中创建对应的表
模型类生成表分为两步:
1)生成迁移文件
python manage.py makemigrations
2)执行迁移生成表
python manage.py migrate
数据库中创建的的表名称格式为:应用名_模型类的小写
本实例中的表明为 "booktest_bookinfo"
4、通过模型类操作数据表(增删改查)
1)增加记录
from booktest.models import BookInfo
from datetime import date
# 数据库中增加记录
# 1 实例化模型类
# 2 添加实例属性 实例属性的名称需要了模型类中的类属性名称一致
# 3 实例调用save()方法完成记录的插入
b = BookInfo()
b.bname = "天龙八部"
b.bpub_data = data(1990,1,1)
b.save()
2)查询记录
from booktest.models import BookInfo
# 查询记录的步骤:
# 1 调用模型类的objects.get()方法 参数为查询条件
# 2 接收1中的返回的结果,类型了模型类的一个实例
# 3 查看 2 中实例的属性即可
b2 = BookInfo.objects.get(bname="天龙八部")
print(b2.bname)
print(b2.bpub_data)
(3) 修改记录
from booktest.models import BookInfo
# 修改记录的步骤:
# 1 先查询到要修改的记录,得到其实例
# 2 对其实例属性进行修改
# 3 调用save()方法
b3 = BookInfo.objects.get(bname="天龙八部")
b3.bname = "天龙八部2"
b3.save()
4) 删除记录
from booktest.models import BookInfo
# 修改记录的步骤:
# 1 先查询到要修改的记录,得到其实例
# 2 调用该实例的delete()方法
b4 = BookInfo.objects.get(bname="天龙八部2")
b4.delete()
5、添加一对多关系
描述:添加一个英雄类,英雄有姓名,性别,大招和出自的书籍属性,其中出自的书籍是图书表的外键。图书表和英雄表是一对多的关系。
1)创建英雄模型类
from django.db import models
# Create your models here.
# 设计和表对应的类 : 模型类
# 图书类
class BookInfo(models.Model):
"""
图书模型类
"""
bname = models.CharField(max_length=20)
bpub_data = models.DateField()
# 英雄类
class HeroInfo(models.Model):
"""
英雄模型类
"""
h_name = models.CharField(max_length=20)
h_gender = models.BooleanField(default=False)
h_comment = models.CharField(max_length=128)
h_book = models.ForeignKey("BookInfo", on_delete=models.CASCADE)
其中models.ForeignKey("BookInfo", on_delete=models.CASCADE),第一个参数为“一”对“多”中的“一”的类名,第二个参数是在删除“一”的时候对“多”的处理方式。models.CASCADE表示在删除“一”时,对“多”采取对应的删除(级联删除)。
on_delete的可取值有以下:
CASCADE
:这就是默认的选项,级联删除,你无需显性指定它。PROTECT
: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError
错误。SET_NULL
: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True
,定义该字段的时候,允许为空。SET_DEFAULT
: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。SET()
: 自定义一个值,该值当然只能是对应的实体了
2)更新并执行迁移文件(参照3.1和3.2)
3)添加英雄记录
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_first_django.settings") # my_first_django 项目名称
django.setup()
from booktest.models import BookInfo, HeroInfo
from datetime import date
b1 = BookInfo()
b1.bname = "天龙八部"
b1.bpub_data = date(1989, 10, 5)
b1.save()
b2 = BookInfo()
b2.bname = "神雕侠侣"
b2.bpub_data = date(1999, 1, 20)
b2.save()
h1 = HeroInfo()
h1.h_name = "乔峰"
h1.h_gender = False
h1.h_comment = "降龙十八掌"
# 注意 在添加英雄的h_book属性时类型为 BookInfo的实例
h1.h_book = b1
h1.save()
h2 = HeroInfo()
h2.h_name = "段誉"
h2.h_gender = False
h2.h_comment = "六脉神剑"
h2.h_book = b1
h2.save()
h3 = HeroInfo()
h3.h_name = "杨过"
h3.h_gender = False
h3.h_comment = "独臂神功"
h3.h_book = b2
h3.save()
h3 = HeroInfo()
h3.h_name = "小龙女"
h3.h_gender = True
h3.h_comment = "睡树枝"
h3.h_book = b2
h3.save()
在booktest_heroinfo表中有h_book_id字段,这个字段和类属性中的h_book对应
4)查看英雄的book属性
hero = HeroInfo.objects.get(h_name="小龙女")
print(hero.h_name)
print(hero.h_gender)
print(hero.h_book)
print(hero.h_book.bname)
print(hero.h_book_id)
5)查看某一书名对应的所有英雄
# 查询书籍的对象
b1 = BookInfo.objects.get(bname="天龙八部")
print(b1.bname)
# 查询书籍对应的所有英雄 使用 b1.heroinfo_set.all() 返回的是一个列表,里面存放的是每个英雄的实例
for hero in b1.heroinfo_set.all():
print(hero.h_name)
print(hero.h_comment)
print()
6)查询表里的所有内容
# 返回一个列表,列表里面是每本书的实例
BookInfo.objects.all()