Django 通过 ORM 实现表的CRUD

单表的创建
  1. 修改 setting.py 文件
  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME': '数据库名称',
  5. 'USER': '用户名',
  6. 'PASSWORD': '密码',
  7. 'HOST': '127.0.0.1',
  8. 'PORT': '3306',
  9. }
  10. }
  1. 修改应用下面对应的models.py 文件
  1. class Book(models.Model):
  2. nid = models.AutoField(primary_key=True) # 表ID 自增主键
  3. title = models.CharField(max_length=32) # 字符串,最大长度为32
  4. price = models.DecimalField(max_digits=8, decimal_places=2) # 小数,最多8位,小数点最多2位
  5. publish = models.CharField(max_length=32)
  6. pub_date = models.DateTimeField()
  1. 修改在与 setting.py 同级的目录下的 _ init_.py 文件
  1. import pymysql
  2. pymysql.install_as_MySQLdb()
  1. 执行以下脚本在应用下创建 migrations 包以及相应的类
  1. python manage.py makemigrations
  1. 执行以下脚本会在数据库中创建 INSTALLED_APPS 中所有对应的数据表
  1. python manage.py migrate
Django 数据的插入(PS:要先完成表的生成)
  • 修改 urls.py 文件
  1. from django.contrib import admin
  2. from django.urls import path
  3. from vedio import views
  4. urlpatterns = [
  5. path('admin/', admin.site.urls),
  6. path('add/', views.add),
  7. ]
  • 修改 views.py 文件
  1. from django.shortcuts import render,HttpResponse,redirect
  2. from vedio.models import Book
  3. def add(request):
  4. # 方法一
  5. """
  6. book = Book(title="Django", price=123, pub_date="2019-10-06", publish="人民出版社")
  7. book.save()
  8. """
  9. # 方法二
  10. Book.objects.create(title="Think PHP", price=123, pub_date="2019-10-06", publish="人民出版社")
  11. # 方法三
  12. """
  13. Book.objects.create(**request.POST.dict())
  14. PS:request.POST 要删除 {{ csrf-token }} 引进了的变量
  15. """
  16. return HttpResponse("OK")
Django 数据的查询,删除,修改
  • 修改 views.py 文件
  1. from django.shortcuts import render,HttpResponse,redirect
  2. from vedio.models import Book
  3. def books(request):
  4. # books = Book.objects.all() # 返回所有记录
  5. books = Book.objects.filter(title="Think PHP") # 查询标题等于 Think PHP的所有记录
  6. # Book.objects.filter(title="Think PHP").delete() # 删除标题为 Think PHP的所有条记录
  7. # Book.objects.filter(nid=1).update(price=120) # 更新 nid=1 这条数据的price
  8. return render(request, "books.html", locals())
  • 修改 urls.py 文件
  1. from django.contrib import admin
  2. from django.urls import path
  3. from vedio import views
  4. urlpatterns = [
  5. path('admin/', admin.site.urls),
  6. path('books/', views.books),
  7. ]
Django 查询深入
  1. from django.shortcuts import render,HttpResponse,redirect
  2. from vedio.models import Book
  3. def books(request):
  4. # all()
  5. # books = Book.objects.all() # 返回所有记录
  6. # filter()
  7. # books = Book.objects.filter(title="Think PHP") # 查询标题等于 Think PHP的所有记录
  8. # books = Book.objects.filter(title="Think PHP", nid=2) # 查询标题等于 Think PHP 并且 nid = 2 的所有记录
  9. # get()
  10. # books = Book.objects.get(title="Think PHP") # 查询标题等于 Think PHP 的一条记录,大于1条或1条都没有将报错
  11. # first() last()
  12. # books = Book.objects.all().first() # 返回 queryset 的第一个 model 对象
  13. # books = Book.objects.all().last() # 返回 queryset 的最后一个 model 对象
  14. # exclude()
  15. # books = Book.objects.exclude(title="Django") # 查询 title 不等于 Django 的 querySet
  16. # order_by()
  17. # books = Book.objects.all().order_by('price') # 根据price 升序
  18. # books = Book.objects.all().order_by('-price') # 根据price 降序
  19. # count()
  20. # books_num = Book.objects.all().count() # 返回书籍的个数
  21. # reverse()
  22. # books = Book.objects.all().reverse() # 逆序
  23. # exits()
  24. # is_exits = Book.objects.all().exists() # 判断数据表是否有数据
  25. # values()
  26. # ret = Book.objects.all().values('title', 'price') # 取 title price 的数据,返回一个列表,列表里面的数据是字典
  27. # values_list()
  28. # ret = Book.objects.all().values_list('title', 'price') # 取 title price 的数据,返回一个列表,列表里面的数据是元组
  29. # distinct()
  30. # books = Book.objects.all().values("title").distinct() # 对 title 中的数据进行去重
  31. # __gt __lt __gte __lte
  32. # books = Book.objects.filter(price__gt=200) # 查询 price 大于200 的数据
  33. # books = Book.objects.filter(price__gte=200) # 查询 price 大于等于200 的数据
  34. # books = Book.objects.filter(price__lt=200) # 查询 price 小于200 的数据
  35. # books = Book.objects.filter(price__lte=200) # 查询 price 小于等于200 的数据
  36. # __startswith __istartswith __contains __icontains
  37. # books = Book.objects.filter(title__startswith="Think") # 查询 title 以 Think 开头的数据
  38. # books = Book.objects.filter(title__istartswith="think") # 查询 title 以 Think 开头的数据,不区分大小写
  39. # books = Book.objects.filter(title__contains="Think") # 查询 包含 Think 的数据
  40. return render(request, "books.html", locals())
Django 一对多表的创建
  • 修改应用下的models.py 文件
  1. from django.db import models
  2. class Book(models.Model):
  3. nid = models.AutoField(primary_key=True) # 表ID 自增主键
  4. title = models.CharField(max_length=32) # 字符串,最大长度为32
  5. price = models.DecimalField(max_digits=8, decimal_places=2) # 小数,最多8位,小数点最多2位
  6. pub_date = models.DateTimeField()
  7. publish = models.ForeignKey(to="Publish", on_delete=models.CASCADE) # on_delete=models.CASCADE 指定级联删除
  8. class Publish(models.Model):
  9. nid = models.AutoField(primary_key=True)
  10. name = models.CharField(max_length=32)
  11. email = models.CharField(max_length=32, null=True) # null=True表示该字段可以为空
Django 多对多表的创建
  • 修改应用下的 models.py 文件
  1. from django.db import models
  2. class Book(models.Model):
  3. nid = models.AutoField(primary_key=True) # 表ID 自增主键
  4. title = models.CharField(max_length=32) # 字符串,最大长度为32
  5. price = models.DecimalField(max_digits=8, decimal_places=2) # 小数,最多8位,小数点最多2位
  6. pub_date = models.DateTimeField()
  7. publish = models.ForeignKey(to="Publish", on_delete=models.CASCADE) # on_delete=models.CASCADE 指定级联删除
  8. authors = models.ManyToManyField(to="Author") # 指定多对多
  9. class Author(models.Model):
  10. nid = models.AutoField(primary_key=True)
  11. name = models.CharField(max_length=32)
  12. age = models.IntegerField()
  13. email = models.CharField(max_length=32)
Django 一对一表的创建
  • 修改应用下的 models.py 文件
  1. from django.db import models
  2. class Author(models.Model):
  3. nid = models.AutoField(primary_key=True)
  4. name = models.CharField(max_length=32)
  5. age = models.IntegerField()
  6. email = models.CharField(max_length=32)
  7. ad = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)
  8. class AuthorDetail(models.Model):
  9. addr = models.CharField(max_length=32)
  10. tel = models.IntegerField()
Django 一对多数据的插入
  1. Book.objects.create(title="Python")
Django 多对多数据的插入
  1. book = Book.objects.create(title="Django")
  2. # 方法一
  3. zp = Author.objects.filter(name="zp").first()
  4. mcx = Author.objects.filter(name="mcx").first()
  5. book.authors.add(zp, mcx)
  6. # 方法二
  7. book.authors.add(1, 2)
  8. # 方法三
  9. book.authors.add(*[1, 2])
Django 多对多数据的解除绑定
  1. book = Book.objects.filter(title="Django").first()
  2. mcx = Author.objects.filter(name="mcx").first()
  3. book.authors.remove(mcx) # 删除 与 book 关联的 mcx
  4. book.authors.clear() # 删除 与 book 关联的所有作者
Django 多对多数据的解除再绑定
  1. book = Book.objects.filter(title="Django").first()
  2. # 方法一
  3. book.authors.clear()
  4. book.authors.add(1)
  5. # 方法二
  6. book.authors.set(1)

Django 通过 ORM 实现表的CRUD的更多相关文章

  1. Django中ORM创建表关系

    一:django中ORM创建表关系 ORM创建外键关系 1.表与表之间的关系 1.表与表之间的关系 一对多 一对一 多对多 2.操作目标条件: 图书表 出版社表 作者表 作者详情表 3.外键关联 一对 ...

  2. python——Django(ORM连表操作)

    千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...

  3. ORM以及Django使用ORM创建表

    day61 2018-04-28 1. 内容回顾 1. HTTP协议消息的格式: 1. 请求(request) 请求方法 路径 HTTP/1.1\r\n k1:v1\r\n ...\r\n \r\n ...

  4. Django之ORM跨表操作

    Django之ORM表查询及添加记录 一.创建表 - 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-man ...

  5. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

  6. django之orm单表查询

    这几天重新学习了一下django的orm,以此作为记录来分享. Part1:修改配置,生成表 在写数据和查数据之前,首先先得把django配置一下,具体配置如下: 1.先在公共项目的settings中 ...

  7. Python--day61--ORM介绍及Django使用ORM创建表

    ORM: 使用django的ORM详细步骤:(pymysql操作数据库:) #1,自己动手创建数据库(create database 数据库名字;) #2,在Django项目中(setting.py文 ...

  8. Django之ORM多表关系创建

    ORM模型多表逻辑创建: 以图书和作者关系模型为例: models.py from django.db import models ''' 一本书只能被一个出版社出版; 一个出版社可以出版多本书; 一 ...

  9. Django(ORM单表操作)

    默认使用sqllite数据库 修改为mysql数据库 创建数据库 在app models中编写创建数据库类 from django.db import models class Book(models ...

随机推荐

  1. Windows快捷方式绑马

    0x01前言 windows的shell32在处理控制面板程序的快捷方式文件时,存在一个漏洞,可以加载硬盘上的任意DLL文件,即可执行任意代码. 之前看到一款俄罗斯黑阔写的的快捷方式下载木马并运行的生 ...

  2. [专题练习] Part1 搜索

    本文中的链接有的是题解有的是题目链接,已经搞混了... 一.DFS(深度优先搜索) 过于水略过. 二.BFS(广度优先搜索) 同上. 三.记忆化 记忆化搜索,就是我们的状态会重复利用,为了防止状态的重 ...

  3. [JOYOI1510] 专家复仇 - Floyd

    题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目背景 外星人完成对S国的考察后,准备返回,可他们的飞碟已经没燃料了……S国的专家暗自窃喜 ...

  4. Cocos2d-x 学习笔记(8) ActionManager

    1. 概述 ActionManager管理所有的action,调度所有的action,删除指定的action.每个action对应一个node对象,action存储在actions中,actions和 ...

  5. Cocos2d-x 学习笔记(15.2) EventDispatcher 事件分发机制 dispatchEvent(event)

    1. 事件分发方法 EventDispatcher::dispatchEvent(Event* event) 首先通过_isEnabled标志判断事件分发是否启用. 执行 updateDirtyFla ...

  6. JVM 垃圾收集与内存分配

    判断对象是否还活着 引用计数法 给对象添加引用计数器,添加加1,引用失效减1,如果为0就是不可使用的.问题是不能解决互相引用带来的问题 可达性分析法 以GC Roots为起点,判断到一个对象是否有引用 ...

  7. 认证授权-学习笔记1-OAuth 2.0

    简介 客户端必须得到用户的授权(authorization grant),才能获得令牌(access token).OAuth 2.0定义了四种授权方式. 授权码模式(authorization co ...

  8. Linux命令比较文件内容

    文件准备 创建两个文件,分别为a.txt和b.txt,它们所含内容分别为: a.txt b.txt 1-wfhune2-chdamnsbchj3-uyr92fiubkqw5-cgvdnsb 2-djy ...

  9. oc基本知识

    (一)构造函数 h文件 #import <Foundation/Foundation.h> @interface Student : NSObject { NSString *_name; ...

  10. QTCreator配置调试参数

    1. 调试参数在“Projects”的配编译参数那儿,编译参数build的旁边run中 2. 加断点是在文件行数左边那个地方