Django模型类操作数据表

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()

猜你喜欢

转载自blog.csdn.net/qq_39197555/article/details/113809570