zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    iOS实现微信外部H5支付完成后返回原APP(多APP也可实现)
    微信开发,仿原生实现 “再按一次返回”功能
    centos 环境变量配置
    centos 6.* 配置端口
    linux 中 svn 服务器搭建 重启
    删除apache注册表
    Linux 编译安装 php 扩展包 curl
    手机APP中使用history.back()返回没有效果的解决
    Centos 6.5升级安装Git
    linux 已有目录挂载磁盘
  • 原文地址:https://www.cnblogs.com/xjmlove/p/9912123.html
Copyright © 2011-2022 走看看