Django 通过 ORM 实现表的CRUD
Django 通过 ORM 实现表的CRUD
单表的创建
- 修改 setting.py 文件
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名称',
'USER': '用户名',
'PASSWORD': '密码',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
- 修改应用下面对应的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()
- 修改在与 setting.py 同级的目录下的 _ init_.py 文件
import pymysql
pymysql.install_as_MySQLdb()
- 执行以下脚本在应用下创建 migrations 包以及相应的类
python manage.py makemigrations
- 执行以下脚本会在数据库中创建 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的更多相关文章
- Django中ORM创建表关系
一:django中ORM创建表关系 ORM创建外键关系 1.表与表之间的关系 1.表与表之间的关系 一对多 一对一 多对多 2.操作目标条件: 图书表 出版社表 作者表 作者详情表 3.外键关联 一对 ...
- python——Django(ORM连表操作)
千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...
- 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 ...
- Django之ORM跨表操作
Django之ORM表查询及添加记录 一.创建表 - 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-man ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
- django之orm单表查询
这几天重新学习了一下django的orm,以此作为记录来分享. Part1:修改配置,生成表 在写数据和查数据之前,首先先得把django配置一下,具体配置如下: 1.先在公共项目的settings中 ...
- Python--day61--ORM介绍及Django使用ORM创建表
ORM: 使用django的ORM详细步骤:(pymysql操作数据库:) #1,自己动手创建数据库(create database 数据库名字;) #2,在Django项目中(setting.py文 ...
- Django之ORM多表关系创建
ORM模型多表逻辑创建: 以图书和作者关系模型为例: models.py from django.db import models ''' 一本书只能被一个出版社出版; 一个出版社可以出版多本书; 一 ...
- Django(ORM单表操作)
默认使用sqllite数据库 修改为mysql数据库 创建数据库 在app models中编写创建数据库类 from django.db import models class Book(models ...
随机推荐
- DNS记录类型
A 记录: A (Address) 记录是用来指定主机名(或域名)对应的IP地址记录.用户可以将该域名下的网站服务器指向到自己的web server上.同时也可以设置您域名的子域名.通俗来说A记录就是 ...
- 快速傅里叶变换(FFT)略解
前言 如果我们能用一种时间上比 \(O(n^2)\) 更优秀的方法来计算大整数(函数)的乘法,那就好了.快速傅里叶变换(FFT) 可以帮我们在 \(O(n\log n)\) 的时间内解决问题. 函数乘 ...
- ESP8266开发之旅 网络篇⑭ web配网
1. 前言 目前,市面上流行多种配网方式: WIFI模块的智能配网(SmartConfig以及微信AirKiss配网) SmartConfig 配网方式 请参考博主之前的博文 ESP8266开 ...
- Spring Boot构建的Web项目如何在服务端校验表单输入
本文首发于个人网站:Spring Boot构建的Web项目如何在服务端校验表单输入 这个例子用于演示在Spring Boot应用中如何验证Web 应用的输入,我们将会建立一个简单的Spring MVC ...
- vue移动端 实现手机左右滑动入场动画
app.vue <template> <div id="app"> <transition :name="transitionName&qu ...
- Azure DevOps 替换 appsettings 解决方案
之前发布了 <.Net Core DevOps -免费用Azure四步实现自动化发布(CI/CD)>之后,有很多朋友私信我说如何替换 appsettings 里面的 ConnectionS ...
- 该虚拟机似乎正在使用中。 如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏。 配置文件: ***.vmx。
打开虚拟机的时候,出现这样的问题: 该虚拟机似乎正在使用中. 如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权.否则,请按“取消(C)”按钮以防损坏. 配置文件: D:\VM\wi ...
- Java基础(二十六)Java IO(3)字节流(Byte Stream)
字节流是以字节为单位来处理数据的,由于字节流不会对数据进行任何转换,因此用来处理二进制的数据. 一.InputStream类与OutputStream类 1.InputStream类是所有字节输入流的 ...
- Java基础(八)对象包装器与自动装箱
1.对象包装器 有时候,需要将int这样的基本类型转换为对象.所有的基本类型都有一个与之对应的类.通常,这些类被称为包装器(wrapper). 这些对象包装类分别是:Integer.Long.Floa ...
- accesskey附上一些实例
HTML accesskey属性与web自定义键盘快捷访问 本文地址:http://www.zhangxinxu.com/wordpress/?p=6142 可能很多小伙伴都不知道,我们只要在HTML ...