• Django之model模块创建表完整过程


    Django中,与数据库相关的模块是model模块,它提供了一种简单易操作的API方式与数据库交互,它是通过ORM映射的方式来操作数据库,一个类对应数据库一张表,一个类属性,对应该表的一个字段,一个实例化的类对象就是一个表中的一行数据信息。在开发的阶段,工程师只需要python语言本身进行代码设计,而不用太过于分散注意力去操作SQL原生操作语句,这样的方法既有它的优点,同样也有不足之处。

    它们优缺点的大致如下:

    优点:

    1、实现了代码与数据库的解耦合

    2、开发者不需要操作太多的原生SQL,可以提高开发效率

    3、防止SQL注入,通过对象操作的方式,默认就是防止SQL注入

    缺点:

    1、牺牲性能,对象转换到SQL会存在一定的消耗

    2、当需要操作较复杂的语句时,用ORM对象操作的方式很难实现

    ORM与数据库的映射关系如下:

    表名--------》类名

    字段--------》属性

    表记录-----》类实例化对象

    ORM的两大主要功能:

      操作表:

          --创建表

          --修改表

          --删除表

      操作表数据行:增、删、改、查

    Django自带的数据库为sqlite3,如果需要使用其他数据库,需要其他的准备工作,并且,使用其他数据库,需要自己提前建好数据库,然后通过Django去连接,Django并不会创建数据库。

    本次使用Django自带数据库进行练习。使用的是Django2.0版本,python3,pycharm2018.2.4版。


    完整过程:

    一、编写模型类

    在Django项目的APP应用下的models.py文件中编写类,每一个类就是一个最终都会被映射为一个数据表。在写类之前有个准备工作,在settings.py文件中的“INSTALLED_APPS”要先加入自己的APP应用,告诉Django有这个应用。如图:

    表分为单表,一对一表,一对多表,多对多表,就是表一般不会独立存在,总会与其他表存在联系。我创建了三个表,一个表为Publish(出版社),一个表为Author(作者),还有一个表Book(书籍),其中表书籍与表出版社是外键关系,与作者是多对多的关系。

     1 class Publish(models.Model):
     2     name = models.CharField(max_length=64)
     3     city = models.CharField(max_length=63,null=True)
     4     def __str__(self):
     5         return self.name
     6 
     7 
     8 class Author(models.Model):
     9     name = models.CharField(max_length=30)
    10     sex = models.CharField(max_length=20)
    11     def __str__(self):
    12         return self.name
    13 
    14 class Book(models.Model):
    15     title = models.CharField(max_length=64)
    16     price = models.IntegerField()
    17     color = models.CharField(max_length=64)
    18     page_num = models.IntegerField(null=True)
    19     publisher = models.ForeignKey("Publish",on_delete=models.CASCADE,null=True)  #一对多的关系。2.0django中,当有主外键和其他对应关系时,需要设置。
    20     author = models.ManyToManyField("Author")
    21     def __str__(self):
    22         return  self.title
    创建类

    二、生成数据表

    创建类的代码已经,写好,此时需要两句代码将类转换成对应的数据表:

    1 python manage.py makemigrations    #将类转换成数据表结构
    2 
    3 python manage.py  migrate               #根据上一句代码生成数据表
    生成数据表

    上面两句代码先后执行,不出意外,就会在数据库里面生成对应的数据表。其中,第一句执行完,会在app应用下的migrations的文件夹下生成操作的记录文件“0001_initial.py”:

    这个是记录models里面改动的执行记录。

     最终生成的数据表如下:

    三、给表插入数据

    现在生成的数据表只是一个空表,接下的工作就是要给表插入数据。

    给表Author插入数据,这个表有两个字段:

     1 from orm测试.models import Author      #引入app下models模块下的Author类
     2 
     3 a=Author.objects()                              #创建对象
     4 
     5 a.create(name="莫言”,sex="m")          #下面三句是分别插入数据
     6 a.create(name="韩寒”,sex="f")
     7 a.create(name="郭敬明”,sex="m")
     8 
     9 
    10 #以上是插入数据的一种方法,还有一种方法时save,这种方法没有create方法效率高。
    View Code

    接下来给表Publish插入数据,注意这个表和Book这个表存在主外键关系。

    1 from orm测试.models import Publish      #导入表Publish
    2 
    3 p=Publish.objects
    4 
    5 p.create(name="北京出版社", city="北京")
    6 p.create(name="江苏出版社", city="江苏")
    7 p.create(name="南京出版社", city="南京")
    8 p.create(name="上海出版社", city="上海")
    View Code

    给表Book插入数据,因为里面字段publisher和表Author存在主外键关系,插入时这个字段的值为Author表的ID(也可以指定其他字段,默认时ID最好)。

     1 from orm测试.models import Book
     2 
     3 b=Book.objects()
     4 
     5 b.create(title="西游记", price=50, color="blue" , page_num=45, publisher_id=1)
     6 b.create(title="三国演义", price=56, color="red" , page_num=60, publisher_id=2)
     7 b.create(title="红楼梦", price=70, color="green" , page_num=80, publisher_id=3)
     8 b.create(title="水浒传", price=100, color="red" , page_num=120, publisher_id=4)
     9 
    10 
    11 
    12 #最后一个字段,在models类中,定义的是publisher,但是在最终生成表时,Django自动会加上"_id",因为这个字段时一个存在主外键的字段。
    View Code

     表Book的字段publisher插入数据还有一种情况,就是不通过赋值id,直接把表publish中某一个对象赋给类属性publisher。下面是具体操作。

    1 #给表Book的字段publsiher插入外键的另一种方式,直接给字段publisher赋值,这个值就是#表Publish的某一个对象。
    2 
    3 p=Publish.objects.filter(id=3)[0]          #拿到一个具体的对象
    4 
    5 b.filter(id=4).update(publisher=p)       #将这个对象赋给类属性publisher
    View Code

    还有最后一个表需要插入数据,这个表就是表书籍和表出版社因为多对多关系生成的一张表,这个表也可以自己创建,这里用了自动生成的那种方式。Django把这个表取名为“book_author”。

     1 #多对多的这种关系,思路就是分别取两个表的对象,把其中的一个对象加入到另一个对象中,#实现两个表的多对多的关系,用到的方法也只有一个"add()"。如果移除,用到remove()方#法。
     2 
     3 
     4 方法一:
     5 ---正向查询。在表Book中,字段“author”是定义多对多的关系的关键,所以在下面建立的关系的时候,对象可以可以直接引用这个属性,所以为正向查询。
     6 
     7 book = models.Book.objects.filter(id=2)[0]          #拿到id=2这个数据行的书对象
     8 authors = models.Author.objects.filter(id_gt=2)   #拿到id大于2的所有集合
     9 book.author.add(*authors)                 #这句就是建立两个表的关系
    10 #book.author.remove(*authors)         #取消两个表的关系
    11 
    12 方法二:
    13 ---反向查询。因为在表Author中,没有定义与表Book相关的字段,使用_set方法。
    14 author = models.objects.filter(id=3)[0]  
    15 books = models.Book.filter(id_gt=2)
    16 author.book_set.add(*books)
    17 #author.book_set.remove(*books)
    View Code

     

    到这里,一个完整的创建数据表,并给数据表添加数据的过程就完成了,过程中其实还有许多细节需要说明,这个在后面的学习中再慢慢补充。

  • 相关阅读:
    js完美拖拽封装及其案例
    js运动框架封装以及两种案例
    js常见的11种兼容
    Lua 学习笔记(五)函数
    Lua 学习笔记(四)语句与控制结构
    Lua 学习笔记(三)表达式
    Lua 学习笔记(二)语法、类型、值
    Lua 学习笔记(一)环境搭建
    Cocos2d-x 3.2 学习笔记(十六)保卫萝卜 游戏主循环与定时器
    Cocos2d-x 3.2 学习笔记(十五)保卫萝卜 场景与数据
  • 原文地址:https://www.cnblogs.com/jiarenanhao/p/9975781.html
Copyright © 2020-2023  润新知