模型

模型类型

(1)定义模型

一个模型可以看做一个类,它对应数据库中的一张表;模型中定义的一个字段,对应一个类的属性

class Student(models.Model):
    s_name = models.CharField(max_length=10)
    s_age = models.IntegerField()
    s_gender = models.BooleanField()

    class Meat:
        # 对列表进行重命名
        db_table = 'cd_student'
        ordering = []
        对象默认排序字段,获取对象列表时使用,升序ordering['id'],降序ordering['-id']
(2)迁移数据
python manage.py makemigrations    ----------  生成迁移文件,不会生成数据库中的表
​

如果生成文件报错,No changes detected,就需要删除pycache文件;强制生成文件python manage.py makemigrations xxx (xxx就是app的名称);并删除数据库中app字段为XXX的数据。
`
python manage.py migrate ————- 迁移文件,生成数据库


##### (3)ORM

ORM(Objects Relational Mapping)对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。可以简单理解为翻译机。

![django_models](F:\gitee\web-img\django_models.jpg)

##### (3)模型查询

- 模型成员objects

**Django默认通过模型的objects对象实现模型数据查询**

- 过滤器

查询集:表示从数据库中获取的要查询对象的集合

**过滤器:就是通过一系列的筛选,得到自己想要的数据的一种方式,它是一个函数,用所给的参数去限制查询的结果**

从SQL角度来说,查询集合和select语句等价,过滤器就像where条件

Django有两种过滤器用于筛选记录

filter      : 返回符合筛选条件的数据集
get获取不到数据会直接报错, filter获取不到数据是返回空
exclude   : 返回不符合筛选条件的数据集

注:filter与exclude可以连在一起限制查询的结果


**过滤器**

```python
all()               返回所有的数据
filter()            返回符合条件的数据
exclude()           返回不符合条件的数据
order_by()          排序,默认是升序
values()            一条数据就是一个字典,返回一个列表
  • 查询单个数据的方法:

    get():返回一个满足条件的对象。如果没有返回符合条件的对象,会引发模型类DoesNotExist异常,如果找到多个,会引发模型类MultiObjectsReturned异常
    
    first():返回查询集中的第一个对象,可以拿到只有一个元素的集合中的元素
    
    last():返回查询集中的最后一个对象,同上
    
    count():返回当前查询集中的对象个数,计数作用
    
    exists():判断查询集中是否有数据,如果有数据返回True,没有返回False
    
    
  • 限制查询集

可以通过下标,来获取想要的数据,等价于sql中的limit ————- 模型名.objects.all()[0:5]取值的下标不能为负。

  • 查询字段
  对SQL中的where实现,作为方法filter(),exclude(),get()的参数
  语法:属性名_比较运算符 = 值
  外键:属性名_id
  注意:like语句中使用%表示通配符。比如sql语句查询 where name like '%xxx%',等同于filter(name_contains='xxx')
  • 比较查询
contains:是否包含,对大小写敏感
startswith,endswith:以values开头或者结尾,大小写敏感 以上的运算符前加上i(ignore)就不区分大小写了
isnull,isnotnull:是否为空  ------------  filter(name__isnull=True)
in:是否包含在范围内  -----------  filter(id__in=[1,2,3])
gt,gte,lt,lte:大于,大于等于,小于,小于等于  ----------  filter(age__gt=10)
pk:代表主键,也就是id  ------------  filter(pk=1)
  • 聚合函数
agregate()函数返回聚合函数的值
Avg:平均值
Count:数量
Max:最大
Min:最小
Sum:求和
example: Student.objects.aggregate(Max('age'))
  • F对象/Q对象

F对象:可以使用模型的A属性与B属性进行比较

班级中有女生个数字段以及男生个数字段,统计女生数大于男生数的班级可以如下操作:

grades = Grade.objects.filter(girlnum__gt=F('boynum'))

Q对象:Q()对象就是为了将过滤条件组合起来,使用符号&或者|将多个Q()对象组合起来传递给filter(),exclude(),get()等函数.

查询学生中不是12岁的或者姓名叫张三的学生
student = Student.objects.filter(~Q(age=12) | Q(name='张三'))

查询python班语文小于80并且数学小于等于80的学生
grade = Grade.objects.filter(g_name='python').first()
students = grade.student_set.all()
stu = students.filter(~Q(s_yuwen__gte=80) & Q(s_shuxue__lte=80))

查询python班语文大于等于80或者数学小于等于80的学生
grade = Grade.objects.filter(g_name='python').first()
students = grade.student_set.all()
stu = students.filter(Q(s_yuwen__gte=80) | Q(s_shuxue__lte=80))

关系

  • 一对一:
    • 已知a对象,查找b对象:a.b
    • 已知a对象,查找b对象:b.a(小写)
  • 一对多:

    • 已知a对象,查找b对象:a.b
    • 已知a对象,查找b对象:b.a_set
  • 多对多:

多对多关系:
1. 生成表的时候会多生成一张表(实际会有三张表)
2. 生成的表是专门用来维护关系的
3. 生成的表是使用两个外键来维护多对多的关系
4. 两个一对多的关系来实现多对多的实现   
5. 删除一个表的数据的话,中间关联表也要删除相关的信息

模板

1.加载静态配置文件

在settings.py中最下面有一个叫做static的文件夹,主要用来加载一些模板中用到的资源,提供给全局使用
这个静态文件主要用来配置css,html,图片,文字文件等

STATIC_URL = ‘/static/’
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, ‘static’)
]

只后在模板中,首先加载静态文件,之后调用静态,就不用写绝对全路径了

2.使用静态配置文件

a) 加载渲染静态配置文件 模板中声明

{% load static %} 或者 {% load staticfiles %}
在引用资源的时候使用

{% static ‘xxx’ %} xxx就是相当于staticfiles_dirs的一个位置
b) 直接定义静态配置

<img src="/static/images/mvc.png">
其中: 展示static文件夹下有一个images文件夹,下面有一个mvc.png的图片

3.模板主要部分

  • HTML静态代码
  • 动态插入的代码段(挖坑,填坑)也就是block

  转载请注明: 微笑看你 模型

 上一篇
python-summary python-summary
函数一、认识函数 没有函数的时候问题是什么?1.同样的代码需要写多次2.一个功能的需求发生改变,需要修改多个地方 怎么解决以上问题?使用函数:提高代码的复用度,让程序更简洁,封装二、函数的声明和调用 1.什么是函数:函数就是对实现某一特定功
2018-11-01
下一篇 
practice linkman practice linkman
MY简单的联系人练习import pymysql def add_con(con): while True: telname = input('联系人姓名:') relation = input(
2018-10-20
  目录