最近学到模型层的更详细的部分了,分享的同时也是自己的积累
我们在某个project的某个app的models.py文件中进行进一步的操作:
我们现在可以对模型类进行如下定义:
from django.db import models
class ModelsName(models.Model):
field1=models.XXField(...)
field2=models.XXField(...)
..
class Meta:
db_table=...
other_metas=...
"""
上面只是一种模型类定义的模板,具体可以自己去实现,这里讲一下Meta类的作用
有看过Python高级的同学肯定知道Meta类就是python中的元类,简单来说就是生成其他类的类,元类的基类是type,这里就不展开讨论了
然后我们来看Meta类还有什么元数据:
abstract:True或False,标识本模型类是否为抽象基类,抽象基类在django中一般用于管理其他模型类
app_label:定义本模型类所属的应用
db_table:映射的数据表名,这应该比较好了解,毕竟模型类的构建就是为了更加方便,直观的去操作数据库中数据表
managed:True或False,定义manage.py是否管理本模型
ordering:本模型记录的默认排序字段
default_permissions:模型的操作权限,默认有三种'add','change','delete'
require_db_vendor:定义底层数据库的类型,比如SQLite,MySQL,Oracle等
unique_together:用来设置不重复的字段组合,必须唯一,相当于主键
index_together:定义联合索引的字段,可以设置多个,索引是用来提高查询效率的
以上说的都是元数据字段,就是有关于数据库怎么创建的,创建成什么样的
...
"""
然后就是普通字段了:
普通字段就是数据表中的各个字段,有:AutoField,CharField,TextField等等很多
普通字段还用参数:primary_key,max_length,choices(就是字段的值域)
基本查询语句:
在命令行下,模型类名.objects.all()
模型类名.objects.filter(条件),过滤器
模型类名.objects.exclude(条件),排除
数据保存与删除:
创建模型类实例后调用save()方法就可以了
删除就调用delete()方法
关系操作:
一对一关系:
class Account(models.Model):
user_name=models.CharField(max_length=90)
passwd=models.CharField(max_length=255)
date=models.DateField()
def __str__(self):
return str(self.user_name)
class People(models.Model):
account=models.OneToOneField(
Account,
on_delete=models.CASCADE,
primary_key=True,
)
code=models.CharField(max_length=80)
address=models.CharField(max_length=100)
def __str__(self):
return str(self.account.user_name)+' '+str(self.address)
'''
ondelete的字段属性注意一下,意思就是,当一个删除了,另一个要不要跟着删除,这里是会跟着删除
大家想一下,上面两个模型类在数据库中会生成什么样的数据表呢,是不是会生成
一个人对应一个账户呢,这与实际的生活也是比较符合的,除非一些特殊情况,所以
数据库的设计也是非常重要的,这需要考虑全面而且要有一定的远瞻
一个好的web基础就是数据库设计一定要做的好,这才能保证程序的长久,而且扩展性也要额外考虑
'''
一对多关系:
类似的一对多就在相应的字段属性里面ForeignKey,这个大家应该都没有问题,因为一对多的关系就是用外键来进行联系的
具体怎么用呢:
在上面的account字段中account=models.ForeignKey(Account),这样,一个Account就可以关联过个人了,这明显就不太符合生活实际,但这只是举例子
多对多关系:
models.ManyToMany(Account)就可以了,多对多关系会生成一张额外的关系表,关系表的主键是连接的两个表的外键
面向对象ORM:
抽象类继承:父类继承自models.Model,但不会在数据库中生成相应的数据表,子类继承自这个父类,子类会创建数据表
父类的Meta的元数据的abstract要设置为True,就有点像c++中抽象类,专门用于给人继承,但是不生成实例,而是让子类
去创建实例
多表继承:
多表继承的每个模型类都在数据库生成相应的数据表,就是父类和子类都会创建数据表,但是子类字段只会创建子类自己的
属性和父类的主键属性
代理模型继承:
代理模型中子类只用于管理父类的数据,所以我们只需在子类的Meta类的元数据里面的proxy=True就行了
那为什么要用代理模型继承呢,因为子类中新的特性不会影响父类模型及其已有代码的行为
总结一下,个人觉得模型层的关键还是数据库的设计,这也是一个项目经理要具备的基本技能,一个好的程序要建立在好的数据库上,还有就是数据查询的优化了,这个我也不是很懂,就不误导大家了