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. [NOIp2013] luogu P1970 花匠

    scy居然开网了. 题目描述 你有一个序列 aaa,你需要保留尽量多的数,使得剩下的数满足以下条件中的一个: ∀x∈[2,n−1]∩N∗\forall x\in[2,n-1]∩\N^*∀x∈[2,n− ...

  2. [JZOJ5185] 【NOIP2017提高组模拟6.30】tty's sequence

    Description

  3. 一个基于C++11的单例模板类

    #ifndef _SINGLETON_H_#define _SINGLETON_H_ template<typename T>class Singleton : public Uncopy ...

  4. stm32cubeMX配置LWIP

    MCU:stm32f769NIHx  PHY:LAN8742A LWIP_VERSION:2.0.3 1.配置RCC,串口(printf debug log) (1)开启RCC,配置时钟系统 图1.1 ...

  5. 03jmeter-json提取器

    要解决的问题:接口返回数据为json格式,需要获取返回结果中的某些值以便后续接口使用 注:可用json path tester(https://jsonpath.curiousconcept.com/ ...

  6. 玩转u8g2 OLED库,一篇就够(分篇)

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  7. 告别10kb/s的Github访问速度

    由于种种原因,国内访问Github的体验一直不是很好.本文通过优化DNS缓存的方式,避免浏览器直接解析Github域名,来改善Github的访问速度. 本文分为如下三个部分: 通过IP地址查询获取访问 ...

  8. 基于TORCS和Torch7实现端到端连续动作自动驾驶深度强化学习模型(A3C)的训练

    基于TORCS(C++)和Torch7(lua)实现自动驾驶端到端深度强化学习模型(A3C-连续动作)的训练 先占坑,后续内容有空慢慢往里填 训练系统框架 先占坑,后续内容有空慢慢往里填 训练系统核心 ...

  9. OptimalSolution(2)--二叉树问题(3)Path路径问题

    一.在二叉树中找到累加和为指定值的最长路径长度 给定一棵二叉树和一个32位整数sum,求累加和为sum的最长路径长度.路径是指从某个节点往下,每次最多选择一个孩子节点或者不选所形成的节点链 -3 / ...

  10. HTML5+CSS:02用户注册表单

            新的学期已开始接近两个月了,还记得是在国庆节那几天申请的博客账号,可过了一个月都还没开始写博客,(>_<)有点小偷懒了,不过,学习还是不能落下的,今写一个有点实践运用的关于 ...