码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-11-06 11:11:52      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:uniq   connect   delete   更新   关联   mysql   exclude   count   div   

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)

 

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

标签:uniq   connect   delete   更新   关联   mysql   exclude   count   div   

原文地址:https://www.cnblogs.com/xjmlove/p/9912123.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!