Models的面向对象

django中的数据库模块提供了一个非常不错的功能,就是支持models的面向对象,可以在models中添加Meta,指定是否抽象,然后进行继承

class Animal(models.Model):
  xxx
  class Meta:
  abstract = True/False
  
  class Dog(Animal):
  xxx

  abstract抽象的,我们可以选择抽象然后进行模板继承

实践:模板继承

新建MODELS
CAT和Dog都是继承Animal

# 新建类Animal
class Animal(models.Model):
    a_name = models.CharField(max_length=16)


class Cat(Animal):
    c_eat = models.CharField(max_length=32)


class Dog(Animal):
    d_legs = models.IntegerField(default=4)

迁移数据

我们观察到,迁移生成了三张表,在dog,和cat表都生成了animal_ptr_id
我们观察DDL

可以看到字段animal_ptr_id既是主键又是外键,这样就和two_animal形成了一对一的映射关系。

新建url:

url('^addcat/', views.add_cat, name='add_cat'),
url('^adddog/', views.add_dog, name='add_dog'),

views:

def add_cat(request):
    cat = Cat()
    cat.name = 'tom'
    cat.c_eat = 'fish'
    cat.save()
    return HttpResponse('cat创建成功   %d' % cat.id)


def add_dog(request):
    dog = Dog()
    dog.name = 'tom'

    dog.save()
    return HttpResponse('dog创建成功   %d' % dog.id)

小技巧shift+f6可以统一修改类中的名字

接着我们访问网页添加dog和cat
cat表

dog表

animal表

我们发现dog和cat表都是级联animal表,这就导致一旦数据庞大,animal表查找速度就会受到影响,(关系型数据库因为查表时候涉及到表与表之间的关系,所以才导致了运行效率慢)

解决办法:添加元信息

我们将之前迁移文件,新建animal,dog,cat的migrations表记录,以及生成的animal,cat,dog表都删除
重新迁移

发现,只生成了两张表,并且这两张表通过,abstract抽象,与类animal没有明显的关系,id也是各自分开存放,没有像之前那样合并在一起存放,不会产生级联表

模型继承

  • Django中模型支持继承
  • 默认继承是会将通用字段放到父表中,特定字段放在自己的表中,中间使用外键连接

    • 默认继承不好

      • 关系型数据库关系越复杂,效率越低,查询越慢
      • 父类表中也会存储过多的数据
  • 使用元信息来解决这个问题

    • 使模型抽象化
    • 抽象的模型就不会在数据库中产生映射了
    • 子模型映射出来的表直接包含父模型的字段

 

在企业中开发中

  • model -> sql

 - 我们之前学习的都是先建立,模型然后生成sql语句

  • sql -> model

    • django也提供了很好的支持
    • python manage.py  inspectdb  
    • 可以直接根据表生成模型

   -  元信息中包含一个属性  manage=False,表名了这个模型不会被迁移模型管理
   - 如果自己的模型不想被迁移系统管理,也可以使用 manage=False进行声明

实践:sql->model型开发

有的项目不用django开发的,会先把表定下来,接着定model,django其实也提供了支持。

连接mysql
创建数据库

mysql> create database SQLTOModel charset=utf8;
mysql> use SQLToModel;
mysql> create table Book( id int auto_increment primary key,b_name varchar(16));

接着我们创建新的工程
 
配置好settings后
我们逆向用数据库生成模型,指令如下:
python manage.py inspectdb

我们可以看到,自动生成了建表语句。
我们也可以直接生成models.py
将App中原本自带的models.py删除,然后输入:
python manage.py inspectdb > App/models.py

我们可以看到成功生成模型。

至此我们的MTV学习已经差不多了,暂告一段落。

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏