Django 通过 ORM 实现表的CRUD

单表的创建
  1. 修改 setting.py 文件
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名称',
'USER': '用户名',
'PASSWORD': '密码',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
  1. 修改应用下面对应的models.py 文件
class Book(models.Model):
nid = models.AutoField(primary_key=True) # 表ID 自增主键
title = models.CharField(max_length=32) # 字符串,最大长度为32
price = models.DecimalField(max_digits=8, decimal_places=2) # 小数,最多8位,小数点最多2位
publish = models.CharField(max_length=32)
pub_date = models.DateTimeField()
  1. 修改在与 setting.py 同级的目录下的 _ init_.py 文件
import pymysql

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

# 方法一
zp = Author.objects.filter(name="zp").first()
mcx = Author.objects.filter(name="mcx").first()
book.authors.add(zp, mcx) # 方法二
book.authors.add(1, 2) # 方法三
book.authors.add(*[1, 2])
Django 多对多数据的解除绑定
book = Book.objects.filter(title="Django").first()
mcx = Author.objects.filter(name="mcx").first()
book.authors.remove(mcx) # 删除 与 book 关联的 mcx
book.authors.clear() # 删除 与 book 关联的所有作者
Django 多对多数据的解除再绑定
book = Book.objects.filter(title="Django").first()

# 方法一
book.authors.clear()
book.authors.add(1) # 方法二
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. [UWP]使用CompositionLinearGradientBrush实现渐变画笔并制作动画

    1. 什么是 CompositionBrush CompositionBrush(合成画笔)是操作可视化层时用于绘制 SpriteVisual 区域的画笔. 使UWP 应用时可以选择使用 XAML 画 ...

  2. 虚拟机Ubuntu系统无法连接网络解决方案

    宿主机连接wifi,虚拟机无法联网 查看是否有网络图标 操作一: sudo service network-manager stopsudo rm /var/lib/NetworkManager/Ne ...

  3. linux下 Mysql 安装使用

    .安装mysql sudo apt-get install mysql-server mysql-client sudo service mysql restart 2.5.7版本以上修修改updat ...

  4. 15.Nginx动静分离Rewrite

    1.什么是动静分离? 将动态请求和静态请求区分访问, 2.为什么要做动静分离? 静态由Nginx处理, 动态由PHP处理或Tomcat处理.... 因为Tomcat程序本身是用来处理jsp代码的,但t ...

  5. java中常见的字符串API

    java中定义了String类来封装字符串,并提供一系列的操作字符串的方法,他们都位于java.lang包下. package Main; public class String01 { public ...

  6. 那些惊艳的 GIS 轮子

    一.前言 GIS 涉及测绘.几何拓扑.人文社科等多方面的科学知识.在 .Net 平台下有着许多优秀的开源产品,比如:MapWindow.SharpMap.WorldWind等.而在这其中,Coordi ...

  7. 设计模式(四)Factory Method模式

    简单来说,用Template Method模式来构建生成实例的工厂,就是Factory Method模式.在这个模式中,父类决定实例的生成方式,但不决定所要生成的具体的类,具体的处理全部交给子类负责. ...

  8. Java基础(十四)代理(Proxy)

    1.为什么要使用代理 代理可以在运行时创建一个实现了一组给定接口的新类.这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用. 假设有一个表示接口的Class对象(有可能只包含一个接口),它的确 ...

  9. SYZOJ中文安装指南

    Made By:Spaceskynet Thanks to other developers. 测试系统 Ubuntu-17.04 PS(全局变量): [syzoj2 path] = 您git的syz ...

  10. [考试反思]1005csp-s模拟测试61:休止

    连续不知道多少场了,都是一场10名以内一场20以外...波动极大...还极有规律... 拿到这套题,看到T1大模拟无话可说. 然后考场上我觉得T2很简单....然后就码了两个半小时. T3数据水了暴力 ...