返回顶部
首页 > 资讯 > 后端开发 > Python >django--ORM的单表操作
  • 292
分享到

django--ORM的单表操作

操作djangoORM 2023-01-30 22:01:48 292人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

Django--ORM单表操作创建一个新的django项目项目目录结构:Django连接数据库配置重点:第一步:修改settings.py文件DATABASES = {     &

Django--ORM单表操作


创建一个新的django项目

blob.png


项目目录结构:

blob.png


Django连接数据库配置

重点:

第一步:

修改settings.py文件

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.Mysql',  # 数据库引擎,使用的是mysql
        'NAME': 'day71',                       # 数据库名
        'USER': 'djanGo123',                   # 账号
        'PASSWord': 'django123',               # 密码
        'HOST': '192.168.11.106',              # ip地址
        'PORT': 3306,                          # 端口
    }
}


第二步:

修改models.py文件,创建表结构

from django.db import models

# Create your models here.
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    pub_date = models.DateField()
    price = models.DecimalField(max_digits=8, decimal_places=2)
    publish = models.CharField(max_length=32)


第三步:

在settings.py同目录找到__init__.py文件,添加

注意:如果pymysql没有安装,先pip3 install pymsyql

import pymysql
pymysql.install_as_MySQLdb()


最后,点击Tools里面的,Run manage.py Task...

blob.png


先运行

makemigrations 

它的作用相当于 在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件



Migrations for 'app01':

  app01\migrations\0001_initial.py

    - Create model Book


再运行

migrate

它是将该改动作用到数据库文件,比如创建表,修改表字段之类的操作


Operations to perfORM:

  Apply all migrations: admin, app01, auth, contenttypes, sessions

Running migrations:

  Applying contenttypes.0001_initial... OK

  Applying auth.0001_initial... OK

  Applying admin.0001_initial... OK

  Applying admin.0002_logentry_remove_auto_add... OK

  Applying app01.0001_initial... OK

  Applying contenttypes.0002_remove_content_type_name... OK

  Applying auth.0002_alter_permission_name_max_length... OK

  Applying auth.0003_alter_user_email_max_length... OK

  Applying auth.0004_alter_user_username_opts... OK

  Applying auth.0005_alter_user_last_login_null... OK

  Applying auth.0006_require_contenttypes_0002... OK

  Applying auth.0007_alter_validators_add_error_messages... OK

  Applying auth.0008_alter_user_username_max_length... OK

  Applying auth.0009_alter_user_last_name_max_length... OK

  Applying sessions.0001_initial... OK



执行完后,可以用pycharm自带的mysql连接工具测试


blob.png


blob.png


表已经成功创建

blob.png



django-ORM插入一条数据

更改urls.py文件,添加一个路径add

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('add/', views.add),

]


更改views.py文件

from django.shortcuts import render,HttpResponse
from app01.models import Book

# Create your views here.
def add(request):
    # 实例化一个对象,并传参
    book = Book(title='西游记', price="88.88", pub_date="2013-12-12", publish='第一出版社')
    book.save()  # 这种方法必须要save(),不然数据不会保存
    return HttpResponse('添加成功')


启动项目:

blob.png


访问

http://127.0.0.1:8000/add/

blob.png


刷新数据库看看

blob.png


第二种方法:推荐使用

objects: 表示管理器

book.objects : 管理book表

create: 添加

from django.shortcuts import render,HttpResponse
from app01.models import Book

# Create your views here.
def add(request):
    book_obj = Book.objects.create(title='红楼梦', price="66.66", pub_date="2014-08-22", publish='第二出版社')
    print(book_obj)  # 返回一个对象,包含记录的所有信息
    print(book_obj.title)
    print(book_obj.price)  
    print(book_obj.publish)
    print(book_obj.pub_date)
    return HttpResponse('添加成功')



访问http://127.0.0.1:8000/add

blob.png


数据库里面看看,第二条数据添加成功

blob.png


控制台看看:

blob.png


更改字段约束条件,设置日期允许为空,添加一个新的字段设置默认值

models.py文件

from django.db import models

# Create your models here.
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    pub_date = models.DateField(null=True)  # null=True 设置允许为空
    price = models.DecimalField(max_digits=8, decimal_places=2)
    publish = models.CharField(max_length=32)
    is_pub = models.BooleanField(default=True)


执行同步数据库更新命令,否则mysql不更新

点击Tools里面的Run manage.py Task....

blob.png


执行命令:

makemigrations

blob.png


会发现app01里面的migrations多出一个文件,此文件记录对应的操作

blob.png


在执行命令,同步数据库

migrate

blob.png


刷新数据库,新创建的字段已经被添加

blob.png


添加一个日期为空的书籍

views.py

from django.shortcuts import render,HttpResponse
from app01.models import Book

# Create your views here.
def add(request):
    # 日期不写
    book_obj = Book.objects.create(title='三国演义', price="77.77", publish='第三出版社')
    print(book_obj)  # 返回一个对象,包含记录的所有信息
    print(book_obj.title)
    print(book_obj.price)
    print(book_obj.publish)
    print(book_obj.pub_date)
    return HttpResponse('添加成功')


访问

http://127.0.0.1:8000/add

blob.png



刷新数据库,pub_date为空,成功添加

blob.png


如果想查看ORM执行的sql语句,打开日志,就可以了

修改settings.py,在最后面添加

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}


在添加一本书:

from django.shortcuts import render,HttpResponse
from app01.models import Book

# Create your views here.
def add(request):
    book_obj = Book.objects.create(title='水浒传',pub_date='2015-11-13', price="99.99", publish='第四出版社')
    print(book_obj)  # 返回一个对象,包含记录的所有信息
    print(book_obj.title)
    print(book_obj.price)
    print(book_obj.publish)
    print(book_obj.pub_date)
    return HttpResponse('添加成功')


访问:

http://127.0.0.1:8000/add

blob.png


查看控制台输出信息:

blob.png




添加查询视图

查询所有记录语法


Book.objects.all()

修改urls.py 路由控制文件,添加查询路由

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('add/', views.add),
    path('query/', views.query),

]


修改views.py 添加查询功能函数

from django.shortcuts import render,HttpResponse
from app01.models import Book

# Create your views here.
def add(request):
    book_obj = Book.objects.create(title='水浒传',pub_date='2015-11-13', price="99.99", publish='第四出版社')
    print(book_obj)  # 返回一个对象,包含记录的所有信息
    return HttpResponse('添加成功')


def query(request):
    # all()
    book_list = Book.objects.all()  # 返回一个queryset数据类型
    # queryset数据类型[obj,obj,obj], list里面存放的都是对象
    print(book_list)
    for obj in book_list:
        # obj相当于表里面的每条记录
        print(obj.title, obj.price)  # 打印每个obj的书名,价格
    return HttpResponse('查询成功')


访问:

http://127.0.0.1:8000/query

blob.png


查看控制台输出信息

blob.png


查询一条记录,修改上面的查询函数的代码

语法: 括号里面写条件

Book.objects.filter()

def query(request):
    ret = Book.objects.filter(price=66.66)
    for obj in ret:
        print(obj.title,obj.price)
    return HttpResponse('查询成功')


访问:

http://127.0.0.1:8000/query

blob.png



first,last,切片操作

语法:

Book.objects.all().first()

Book.objects.all().last()

Book.objects.all()[1:3]

def query(request):
    # 查询第一条记录
    obj1 = Book.objects.all().first()
    print(obj1.title, obj1.price)

    # 查询最后一条记录
    obj2 = Book.objects.all().last()
    print(obj2.title, obj2.price)

    # 切片操作
    obj3 = Book.objects.all()[1:3]
    for i in obj3:
        print(i.title, i.price)
    return HttpResponse('查询成功')

访问:http://127.0.0.1:8000/query

blob.png


查询表记录

查询API

<1> all():                  查询所有结果
  
<2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象
  
<3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
                            如果符合筛选条件的对象超过一个或者没有都会抛出错误。
  
<4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象
 
<5> order_by(*field):       对查询结果排序
  
<6> reverse():              对查询结果反向排序
  
<8> count():                返回数据库中匹配查询(QuerySet)的对象数量。
  
<9> first():                返回第一条记录
  
<10> last():                返回最后一条记录
  
<11> exists():              如果QuerySet包含数据,就返回True,否则返回False
 
<12> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                            model的实例化对象,而是一个可迭代的字典序列

<13> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
 
<14> distinct():            从返回结果中剔除重复纪录


基于双下划线的模糊查询

Book.objects.filter(price__in=[100,200,300])   查询价格等于100,200,300的书籍

Book.objects.filter(price__gt=100)             查询价格大于100

Book.objects.filter(price__gte=100)            查询价格大于等于100

Book.objects.filter(price__lt=100)             查询价格小于100

Book.objects.filter(price__lte=100)            查询价格小于等于100

Book.objects.filter(price__range=[100,200])    查询100到200之间的
Book.objects.filter(title__contains="python")  查询title中是否包含有Python
Book.objects.filter(title__icontains="python") 获得title字段里含有python的Book对象集合
Book.objects.filter(title__startswith="py")    查询以py开头的书籍
Book.objects.filter(pub_date__year=2012)       查询pub_date字段year=2012



update数据

修改urls.py,添加一条路由change

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('add/', views.add),
    path('query/', views.query),
    path('change/', views.change),

]


修改views.py,添加一个修改函数

查询id=1的字段,并更改price=333

def change(request):
    id = 1
    Book.objects.filter(id=id).update(price=333)
    return HttpResponse('修改成功')


访问:http://127.0.0.1:8000/change/

blob.png


查看数据是否修改成功,已经修改成功

blob.png



delete数据

修改urls.py,添加一条路由delbook

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('add/', views.add),
    path('query/', views.query),
    path('change/', views.change),
    path('delbook/', views.delbook),

]


修改views.py,添加一个删除函数

def delbook(request):
    Book.objects.filter(title='水浒传').delete()
    return HttpResponse("删除成功")


访问: http://127.0.0.1:8000/delbook/

blob.png


查看数据是否成功删除,成功删除

blob.png



需求:url参数为2,就删除id为2的记录

例:http://127.0.0.1/delbook/2

修改urls.py,delbook路由

from django.contrib import admin
from django.urls import path, re_path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('add/', views.add),
    path('query/', views.query),
    path('change/', views.change),
    re_path('delbook/(?P<id>\d+)', views.delbook),

]


修改views.py

def delbook(request,id):  # 接收id参数
    Book.objects.filter(id=id).delete()
    return HttpResponse("删除成功")


访问:http://127.0.0.1:8000/delbook/2

如果数据不存在,也会提示删除成功

blob.png


查看数据库里面是否更改

blob.png



查询练习:

sql语句:

 INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) 
 VALUES ('1', 'Python基础', '2017-06-01', '200.00', '人民出版社', '1');
INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) 
VALUES ('2', '西游记', '2017-08-08', '100.00', '苹果出版社', '1');
INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
 VALUES ('3', '红楼梦', '2017-08-10', '50.00', '苹果出版社', '1');
INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
 VALUES ('4', '水浒传', '2017-08-25', '150.00', '人民出版社', '1');
INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
 VALUES ('5', '三国演义', '2017-12-20', '88.00', '苹果出版社', '1');
INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
 VALUES ('6', 'python爬虫', '2018-02-10', '300.00', '人民出版社', '1');
INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
 VALUES ('7', 'python大数据', '2018-05-15', '350.00', '苹果出版社', '1');
INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
 VALUES ('8', 'java', '2017-08-11', '55.00', '苹果出版社', '1');
INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
 VALUES ('9', 'go', '2018-06-04', '66.00', '苹果出版社', '1');
INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
 VALUES ('10', 'PHP', '2018-06-08', '99.00', '苹果出版社', '1');
INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
 VALUES ('11', 'c', '2018-05-22', '156.00', '苹果出版社', '1');
INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
 VALUES ('12', 'c++', '2018-04-17', '650.00', '苹果出版社', '1');


表数据如下:

blob.png


1 查询苹果出版社出版过的价格大于200的书籍

ret = Book.objects.filter(price__gt=200, publish='苹果出版社', is_pub=True).values('title', 'price')
for i in ret:
    print(i['title'], i['price'])

结果:

python大数据 350.00

c++ 650.00


2 查询2017年6月出版的所有以py开头的书籍名称

ret = Book.objects.filter(title__startswith='py',pub_date__year=2017, pub_date__month=6).values('title')
for i in ret:
    print(i['title'])

结果:

python基础



3 查询价格为50,100或者150的所有书籍名称及其出版社名称 

ret = Book.objects.filter(price__in=[50,100,150]).values('title', 'publish')
for i in ret:
    print(i['title'], i['publish'])

结果:

西游记 苹果出版社

红楼梦 苹果出版社

水浒传 人民出版社


4 查询价格在100到200之间的所有书籍名称及其价格

ret = Book.objects.filter(price__range=[100, 200]).values('title', 'price')
for i in ret:
    print(i['title'], i['price'])

结果:

python基础 200.00

西游记 100.00

水浒传 150.00

c 156.00


5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)

ret = Book.objects.filter(publish='人民出版社').order_by('price').reverse().values('title','price','publish')
..distinct()
for i in ret:
    print(i['title'], i['price'],i['publish'])

结果:

python爬虫 300.00 人民出版社

python基础 200.00 人民出版社

水浒传 150.00 人民出版社


6 查询价格大于200的书籍的个数

ret = Book.objects.filter(price__gt=200).count()
print(ret)

结果:

3


7 查询价格不等于100的所有书籍

ret = Book.objects.exclude(price=100).values('id', 'title', 'price', 'publish')
for i in ret:
    print(i['id'], i['title'], i['price'], i['publish'])

结果:

1 python基础 200.00 人民出版社

3 红楼梦 50.00 苹果出版社

4 水浒传 150.00 人民出版社

5 三国演义 88.00 苹果出版社

6 python爬虫 300.00 人民出版社

7 python大数据 350.00 苹果出版社

8 java 55.00 苹果出版社

9 go 66.00 苹果出版社

10 php 99.00 苹果出版社

11 c 156.00 苹果出版社

12 c++ 650.00 苹果出版社


8 查询苹果出版社出版的书籍中的第3-7本(前提存在足够数量的书籍)

ret = Book.objects.filter(publish='苹果出版社')[3:7].values('id','title','price','publish')
for i in ret:
    print(i['id'], i['title'], i['price'], i['publish'])

结果:

7 python大数据 350.00 苹果出版社

8 java 55.00 苹果出版社

9 go 66.00 苹果出版社

10 php 99.00 苹果出版社


--结束END--

本文标题: django--ORM的单表操作

本文链接: https://lsjlt.com/news/179193.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • django--ORM的单表操作
    Django--ORM单表操作创建一个新的django项目项目目录结构:Django连接数据库配置重点:第一步:修改settings.py文件DATABASES = {     &...
    99+
    2023-01-30
    操作 django ORM
  • django操作非ORM创建的表
    django--ORM连接已存在的表问题:django的ORM怎么连接已存在的表,然后进行增删查改操作?工作中会遇见很多二次开发的时候,表都是已经创建好的,用django的ORM进行二次开发,怎么操作数据库中的表呢下面介绍一种完美解决方案:...
    99+
    2023-01-30
    操作 django ORM
  • Python Django ORM连表正反操作技巧
    一、A表男生,B表女生,C表关系 1通过A表查与某个男生有关系的所有女生 思想1:在A表中确认男生后,通过反查到C表,获取相关内容(QuerySet),然后再跨到B表获取所有女生信...
    99+
    2024-04-02
  • 如何理解Django ORM操作
    这篇文章主要讲解了“如何理解Django ORM操作”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Django ORM操作”吧!查询聚合操作聚合操作...
    99+
    2024-04-02
  • 怎么理解Django ORM操作
    本篇内容主要讲解“怎么理解Django ORM操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Django ORM操作”吧!表结构设计还是从实际角度出...
    99+
    2024-04-02
  • 如何了解Django ORM操作
    本篇内容主要讲解“如何了解Django ORM操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何了解Django ORM操作”吧!查询操作对象.外键字段比如,我们拿到了一个书的信息,我们可以...
    99+
    2023-06-15
  • django的数据库ORM进阶操作
    1、数据库查询的三种方式 正向查询: (1)获取全部数据all     v1=models.UserInfo.objects.all().first()    #取出Querryset类型数据,里面是对象,需循环取出     v1.ut  ...
    99+
    2017-08-05
    django的数据库ORM进阶操作 数据库入门 数据库基础教程 数据库 mysql
  • CMDB之Django 数据库ORM操作
    CMDB实现数据展示功能部分代码。 views.py def asset(request):     asset = Asset.ob...
    99+
    2024-04-02
  • Django图书管理系统(单表操作)
    以下内容需要掌握: Python3 以及前端:HTML,CSS,jQuery,BootStrap,Django,JavaScript 开启Django新项目: 1,settings.py  数据库选择: ①sqlite3(Django自...
    99+
    2023-01-30
    图书管理系统 操作 Django
  • Django ORM 事务和查询优化的操作方法
    目录一、事务操作二、 ORM 惰性查询三、only与defer四、select_related与prefetch_related一、事务操作 模块 from django....
    99+
    2024-04-02
  • Python Django ORM 深潜:掌控数据库操作的艺术
    Django 对象关系映射器 (ORM) 是一个强大且灵活的工具,它允许 Django 开发人员以面向对象的方式与数据库交互。通过使用 ORM,开发人员可以将数据库表映射到 Python 类,并通过这些类来访问和操作数据库中的数据。 Dj...
    99+
    2024-04-02
  • Django视图之ORM数据库查询操作API的实例
    查询表记录 查询相关API 操作:models.表名.objects.方法() <BR>all(): 查询所有结果 filter(**kwargs): 它包含了与所给筛选条件...
    99+
    2022-06-05
    视图 数据库查询 实例
  • Python操作MySQL(二) ORM
    SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 一、安装 pip3 install ...
    99+
    2023-01-31
    操作 Python ORM
  • Django项目中表的查询的操作
    目录shell操作:使用的环境:Django项目 ORM常用的十三种查询方法2022-09-29 shell操作:   我在使用中是pycharm与数据库建立连接的一个工具。 使用的...
    99+
    2024-04-02
  • Django ORM 多表查询示例代码
    目录数据准备正向查询与反向查询基于对象的跨表查询正向查询一对多多对多一对一反向查询 一对多多对多一对一正向查询反向查询基于双下线的跨表查询正向查询一对一一对多多对多反向查询一对一一对...
    99+
    2024-04-02
  • Django之模型层(多表操作)
      一、创建模型   1,一对多关系   一本书只有一个出版社,一个出版社可以出版多本书,从而书与出版社之间就构成一对多关系,书是‘多’的一方,出版社是‘一’的一方,我们在建立模型的时候,把外键写在‘多’的一方,即我们要把外键写在book...
    99+
    2023-01-30
    模型 操作 Django
  • Django 模型层之多表操作
    一.创建模型 实例: 作者表: 拥有字段:姓名(name),性别(sex),该表与书籍表之间为多对多的关系 作者详情表: 拥有字段:地址(addr),手机号(phone),该表与作者表之间为一对一的关系 出版社表: ...
    99+
    2023-01-30
    之多 模型 操作
  • Python操作MySQL(二) ORM篇
    SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 一...
    99+
    2024-04-02
  • python orm框架SQLAlchemy简单应用(数据库操作)
    #_*_coding:utf-8_*_ ''' 创建SQLAlchemy应用基本过程 1、创建连接(和关系数据库创建连接) 2、声明映射文件(python中到类和数据库中的表做一对一的映射,这样就可以通过p...
    99+
    2024-04-02
  • Django静态文件配置request对象方法ORM操作讲解
    目录django框架请求流程静态文件及相关配置请求方法request对象方法pycharm链接MySQLDjango链接MySQLDjango ORMORM语法ORM外键关联djan...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作