009---Django的模型层(1)

ORM
全称:对象--关系--映射
数据表----类
数据行----对象
字 段----属性
优势:专注于后端逻辑,不用写复杂的sql语句
劣势:会忘掉sql,牺牲了效率

Django连接mysql数据库:
 1             DATABASES = {
 2             'default': {
 3                 'ENGINE': 'django.db.backends.mysql',
 4                 'NAME': 'orm1',  # 连接的数据库,需要自己提前创建好
 5                 'USER':'root',  # 连接数据库的用户名
 6                 'PASSWORD':'root', # 连接数据库的密码
 7                 'HOST':'127.0.0.1', # 连接主机,默认本机
 8                 'PORT':3306,        # 端口,默认3306
 9             }
10         }
settings.py

项目目录下的__init__.py

1         import pymysql
2         pymysql.install_as__MYSQLdb()

创建模型:app下的models.py

 1 # Create your models here.
 2 class Book(models.Model):
 3     id = models.AutoField(primary_key=True)
 4     title = models.CharField(max_length=32)
 5     pub_date = models.DateField()
 6     price = models.DecimalField(max_digits=8,decimal_places=2)
 7     publish = models.CharField(max_length=32)
 8 
 9     def __str__(self):
10         return self.title

常用字段:

1 常用字段类型
2     # 主键、自增       id = models.AutoField(primary_key=True)
3     # varchar         name = models.CharField(max_length=16)     后面一定要有长度  代表varchar(16)
4     # 整数            age = models.IntegerField()
5     # 浮点数           price = models.DecimalField(max_digits=8,decimal_places=2)  最大长度八位,小数点后面两位
6     # 日期时间         birth = models.DateTimeField(auto_now_add=True) 对象创建时自动添加当前时间  就好比人出生就有一个生日一样
7     # 日期            pub_date = models.DateField(auto_now=True)      对象每次修改时修改为当前时间   两个互斥 不可共存
8     # 大文本类型       content = model.TextField()

自定义字段:

 1     class MyCharField(models.Field):
 2     """
 3     继承model.Field
 4     自定义的char类型字段
 5     """
 6     def __init__(self,max_length,*args,**kwargs):
 7         # super(MyCharField, self).__init__(max_length=max_length,*args,**kwargs)
 8         super().__init__(max_length,*args,**kwargs)
 9         # models.Field.__init__(self,max_length=max_length,*args,**kwargs)
10         self.max_length = max_length
11 
12     def db_type(self, connection):
13         """
14         限定生产数据库表的字段类型为char,长度为max_length指定的值
15         :param connection:
16         :return:
17         """
18         return 'char(%s)'%self.max_length

字段参数:

1 字段参数
2     null = True   和数据库直接关联
3     blank = True  和表单提交验证关联 一般同时写上
4     db_column     列名 数据库显示的列名 但是orm还是自己的列名
5     default       默认值
6     unique        唯一索引
7     verbose_name  admin显示中文
8     choices       sex = models.CharField(max_length=2,choices=(('1',''),('2',''),('3','未知')))  数据库存的是前面的,要显示后面的用obj.get_sex_display()
9                   模版取值{{ user|func:'sex'}} func是自己写的过滤器

Meta配置:

    class Meta:
    # 数据库生成的表名
    db_table='table_name'
    verbose_name='admin站点表名显示的名称'
    verbose_name_plural='对象是复数时显示的名称'

    #联合唯一索引
    unique_together=[
        ('field1','field2')
    ]

生成迁移文件:

1 python manage.py makemigrations

执行迁移:

1 python manage.py migrate

必知必会13条查询方式:

为了方便查询,添加django环境。直接运行py文件

import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ORM1.settings")
    import django
    django.setup()

    from app01.models import Book

    # 对象列表
    # ret = Book.objects.all()
    # print(ret)

    # get  不存在就报错   获取多个就报错
    # ret = Book.objects.get(pk=3)
    # print(ret)  # Java  ret.price

    # filter 返回queryset集合  不存在返回空,
    # ret= Book.objects.filter(pk=3)
    # print(ret)  # <QuerySet [<Book: Java>]> ret[0].price

    # exclude 排除 不包含
    # ret = Book.objects.exclude(id=3)
    # print(ret)

    # 返回queryset集合  获取指定参数,默认获取所有 相当于select * form Book 的 *  字典类型
    # ret = Book.objects.all().values()
    #     # ret = Book.objects.all().values('title','price')
    #     # print(ret)

    # 返回queryset集合  和values一样,但是是元祖形式
    # ret = Book.objects.all().values_list('title','price')
    # print(ret)

    # order_by  排序可以按照多个字段
    # ret = Book.objects.order_by('-pk','price')
    # print(ret)

    # reverse  反转  对排序后的结果再反转
    # ret = Book.objects.order_by('-pk', 'price').reverse()
    # print(ret)

    # distinct 去重  针对的是对字段去重 对all使用无任何意义
    # ret = Book.objects.all().values('title').distinct()
    # print(ret)

    # count 计数
    # ret = Book.objects.all().count()
    # print(ret)

    # exists  判断数据是否存在
    # ret = Book.objects.filter(pk=3).exists()
    # print(ret)


    # -----------------------------------模糊查询-----------------------------------
    print(Book.objects.filter(price__gt=70).values('title','price')) # 大于 等于在后面加e
    print(Book.objects.filter(price__lt=70).values('title','price')) # 小于 等于在后面加e
    print(Book.objects.filter(title__startswith='P'))   # <QuerySet [<Book: Python>]>
    print(Book.objects.filter(title__icontains='p'))    # <QuerySet [<Book: Python>, <Book: php>]>
    print(Book.objects.filter(price__in=[66,99]))
    print(Book.objects.filter(price__range=[60,90]))

总结:

 1 总结:
 2     返回queryset集合
 3         all()
 4         filter()
 5         exclude()
 6         order_by
 7         reverse()
 8         values()  {}
 9         values_list()  ()
10         distinct()
11     返回对象
12         get()
13         first()
14         last()
15 
16     返回布尔值
17         exists()
18 
19     返回数字
20         count()

 查询之后才能进行更新或删除操作

删除:

1 ret = Book.objects.filter(title='Linux').delete()
2 Book.objects.filter(publish='人民出版社').first().delete()
3 print(ret)  # 元祖 返回个数和记录

更新:

1     # update 更新  调用者 queryset
2     Book.objects.filter(id=1).update(price=99.99)

 

posted @ 2018-11-06 09:19  爬呀爬Xjm  阅读(218)  评论(0编辑  收藏  举报