Python框架篇之Django(ORM对象关系映射)

一、认识ORM

1、概念:简单来说,就是用面向对象的方式去操作数据库的创建表以及增删改查等操作。

2、ORM的优点

  • ORM使我们的通用数据库交互变得简单易行,完全不用考虑该死的SQL语句,实现快速开发
  • 可以避免一些新手程序猿写SQL语句带来的性能问题

3、表与表之间的关系
表与表之间的关系主要分为:一对一、一对多、多对多

  • 一对一:在主外键(foreign key)的关系基础上,给外键加了属性

一个班级有很多学生,他们分别有不同的学号。一个学生对应一个学号,一个学号对应一个学生;通过学号能找到学生,通过学生也能得到学号,不会重复。这里学生和学号的关系就是一对一

  • 一对多:就是主外键关系(foreign key)

一个班级有很多学生,可是这个班级只有一个班主任。在这个班级中回随便找答一个人,就会知道他们的班主任是谁;知道了这个班主任就会知道有哪几个学生。这里班主任和学生的关系就是一对多。

  • 多对多:自动创建第三张表(当然我们也可以自己创建第三张表:两个foreign key)

一个班级有很多学生,他们有语文课、数学课、英语课等很多课。一门课有很多人上,一个人上很多门课。这里学生和课程的关系就是多对多。

  • 多对一:

比如说一个班级有很多学生,可是这个班级只有一个班主任。在这个班级中随便找一个人,就会知道他们的班主任是谁;知道了这个班主任就会知道有哪几个学生。这里学生和班主任的关系就是多对一。

例如:书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系,也被称作外键。

二、模型常用字段类型

  • CharField:字符串字段, 用于较短的字符串.
    必要参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数

  • IntegerField:用于保存一个整数.

  • FloatField:浮点数,必须的两个参数:
    max_digits——总位数(不包括小数点和符号)
    decimal_places——小数位数

  • BooleanField:A true/false field. admin 用 checkbox 来表示此类字段

  • TextField:一个容量很大的文本字段

  • EmailField:带有检查Email合法性的 CharField,不接受 maxlength 参数

  • DateField:日期字段,有两个非必须参数:
    Argument 描述
    auto_now 当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示 “last-modified” 时间戳

  • ImageField:类似 FileField, 不过要校验上传对象是否是一个合法图片

  • FileField:文件上传字段,要求一个必须有的参数: upload_to

  • URLField: 用于保存 URL. 若 verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否存在( 即URL是否被有效装入),没有返回404响应

三、数据表的增删改查

1、数据表记录的添加

def addbook(request):
    # 第一种添加方法:实例化一个Book对象
    # b=Book(name="python进阶",price=199,author="Lin",pub_date="2020-6-29")
    # b.save()

    #第二种添加方法:使用create
    Book.objects.create(name="泽法",price=98,author="okok",pub_date="2019-12-12")
    #Book.objects.create(**dic)
    #获取全部前端发来的键值对加入到数据库,前提是键值对的键名与数据表表头字段必须一一对应

    return HttpResponse("添加成功")

2、数据表记录的修改

def update(request):

    # 方法一:
    # 查找到author=“zahuw”,将对应的price改为999
    Book.objects.filter(author="zahuw").update(price=999)

    # 方法二(效率低):get取一条记录
    # b=Book.objects.get(author="zahuw")
    # b.price=120
    # b.save()
    # print(b)
    #用filter得到的集合就是一个:<QuerySet [<Book: Book object>]>对象集合
    # print(type(b))

    return HttpResponse("修改成功!")

3、数据表记录的删除

def delete(req):

    Book.objects.filter(author="zahuw").delete()

    return HttpResponse("successfully")

4、数据表的查询

def select(req):
    # 先获取所有Book对象
    # book_list=Book.objects.all()
    # print(book_list)
    # print(book_list[0])#Book object取第一本书
    # book_list = Book.objects.filter(id=2) # 取id=2的书的集合(只要是filter就是取一个集合)
    # book_list = Book.objects.all()[:3]   # 用切片取前三本书
    # book_list = Book.objects.all()[::2]   # 设置步长为2,隔两本取一本
    # book_list = Book.objects.all()[::-1]  # 从后往前取
    # book_list = Book.objects.first()
    # book_list = Book.objects.last()
    # book_list = Book.objects.get(id=2)    # 只能取出一个对象
    
    # ret1=Book.objects.filter(author="zahuw").values("name")  # 取某个字段的值的键值对集合
    # ret2=Book.objects.filter(author="zahuw").values_list("name","price")  # 元组的集合
    # book_list=Book.objects.exclude(author="zahuw").values("name","price")
    # print(ret1)
    # print(ret2)

    # book_list= Book.objects.all().values("name").distinct()  # 去重
    # book_count= Book.objects.all().values("name").distinct().count()
    # print(book_count)

    #万能的双下划线  __:用于模糊匹配

    # 过滤出price>=50的记录
    # book_list=Book.objects.filter(price__gt=50).values("name","price")
    book_list=Book.objects.filter(name__contains="P").values_list("name","price")


    return render(req,"index.html",{"book_list":book_list})

四、配置日志

每执行一次就会有记录,需要我们在settings.py文件中加入以下代码:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章