Django丨ORM - 单表实例

ORM - 单表实例


创建一个项目

django-admin.py startproject app01

在settings.py中修改INSTALLED_APPS

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',               # 添加此项
)

创建模型

项目中的models.py

# app01/models.py
class Sites(models.Model):
    id = models.AutoField(primary_key=True) # id 会自动创建,可以手动写入
    title = models.CharField(max_length=32) # 书籍名称
    price = models.DecimalField(max_digits=5, decimal_places=2) # 书籍价格
    publish = models.CharField(max_length=32) # 出版社名称
    pub_date = models.DateField() # 出版时间

执行命令

python3 manage.py migrate   # 创建表结构

python3 manage.py makemigrations app01  # 让 Django 知道我们在我们的模型有一些变更
python3 manage.py migrate app01   # 创建表结构

注:需要连接数据库

添加数据

路由配置

# app01/urls.py
from django.contrib import admin
from django.urls import path
from . import views
 
urlpatterns = [
    path('add_book/', views.add_book),
]
  • 方式一:模型类实例化对象
# app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import models 
def add_book(request):
    book = models.Book(title="python程",price=300,publish="hero",pub_date="2008-8-8") 
    book.save()
    return HttpResponse("

数据添加成功!

"
)
  • 方式二:通过ORM提供的objects提供的方法create来实现
from django.shortcuts import render, HttpResponse
from app01 import models 

def add_book(request):
    books = models.Book.objects.create(title="如来神掌", price=200, publish="功夫出版社", pub_date="2010-10-10") 
    return HttpResponse("

数据添加成功!

"
)

查找数据

  • 使用all()方法来查询所有内容

返回的是QuerySet类型数据,类似于list,里面放的是一个个模型类的对象,可用索引下标取出模型类的对象。

# app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import models 

def add_book(request):
    books = models.Book.objects.all() 
    print(books, type(books)) # QuerySet类型,类似于list,访问 url 时数据显示在命令行窗口中。
    return HttpResponse("

查找成功!

"
)
  • filter()方法用于查询符合条件的数据

返回的是QuerySet类型数据,里面放的是满足条件的模型类的对象,可用索引下标取出模型类的对象。

# app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import models 
def add_book(request):
    books = models.Book.objects.filter(pk=5)
    print(books)
    print("//")
    books = models.Book.objects.filter(publish='python', price=300)
    print(books, type(books))  # QuerySet类型,类似于list。
    return HttpResponse("

查找成功!

"
)

注:pk意思是primary key,相当于id

  • exclude()方法用于查询不符合条件的数据

返回的是QuerySet类型数据。

# app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import models 

def add_book(request):
    books = models.Book.objects.exclude(pk=5)
    print(books)
    print("//")
    books = models.Book.objects.exclude(publish='菜鸟出版社', price=300)
    print(books, type(books))  # QuerySet类型,类似于list。
    return HttpResponse("

查找成功!

"
)
  • get()方法用于查询符合条件的,返模型类的对象符合条件的对象只能为一个,如果符合筛选条件的对象超过了一个或者没有一个都会抛出错误。
# app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import models 

def add_book(request):
    books = models.Book.objects.get(pk=5)
    books = models.Book.objects.get(pk=18)  # 报错,没有符合条件的对象
    books = models.Book.objects.get(price=200)  # 报错,符合条件的对象超过一个
    print(books, type(books))  # 模型类的对象
    return HttpResponse("

查找成功!

"
)
  • order_by()方法用于对查询结果进行排序

返回的是QuerySet类型数据。

注:

1、参数的字段名要加引号
2、降序为在字段前面加个符号 -

# app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import models 
def add_book(request):
    books = models.Book.objects.order_by("price") # 查询所有,按照价格升序排列 
    books = models.Book.objects.order_by("-price") # 查询所有,按照价格降序排列
    return HttpResponse("

查找成功!

"
)
  • count()方法用于查询数据的数量返回的数据是整数
# app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import models 

def add_book(request):
    books = models.Book.objects.count() # 查询所有数据的数量 
    books = models.Book.objects.filter(price=200).count() # 查询符合条件数据的数量
    return HttpResponse("

查找成功!

"
)
  • exists()方法用于判断查询的结果,返回的数据类型是布尔,有为True,没有为False
from django.shortcuts import render,HttpResponse
from app01 import models

def add_book(request):
    books = models.Book.objects.exists()
    # 报错,判断的数据类型只能为QuerySet类型数据,不能为整型
    books = models.Book.objects.count().exists()
    # 报错,判断的数据类型只能为QuerySet类型数据,不能为模型类对象
    books = models.Book.objects.first().exists()  
    return HttpResponse("

查找成功!

"
)

注:判断的数据类型只能为QuerySet类型数据

  • distinct()方法用于对数据进行去重,返回的是QuerySet类型数据

注:

1、对模型类的对象去重没有意义,因为每个对象都是一个不一样的存在

2、distinct()一般是联合values或者values_list使用

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

def add_book(request):
    # 查询一共有多少个出版社
    books = models.Book.objects.values_list("publish").distinct() # 对模型类的对象去重没有意义,因为每个对象都是一个不一样的存在。
    books = models.Book.objects.distinct()
    return HttpResponse("

查找成功!

"
)

filter()方法基于双下划线的模糊查询(exclude同理)

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

def add_book(request):
    # 查询价格为200或者300的数据
    books = models.Book.objects.filter(price__in=[200,300])
    return HttpResponse("

查找成功!

"
)
  • __gt大于号,=号后面为数字(greater than)
# 查询价格大于200的数据 
books = models.Book.objects.filter(price__gt=200)
  • __gte大于等于,=号后面位数字(greater than or equal to)
# 查询价格大于等于200的数据 
books = models.Book.objects.filter(price__gte=200)
  • __lt小于
# 查询价格小于300的数据 
books=models.Book.objects.filter(price__lt=300)
  • __lte小于等于
# 查询价格小于等于300的数据 
books=models.Book.objects.filter(price__lte=300)
  • __contains包含
books = models.Book.objects.filter(title__contains="菜")
  • __icontains不区分大小写的包含
books = models.Book.objects.filter(title__icontains="python") # 不区分大小写

删除数据

  • 方式一:使用模块类的对象.delete()

返回值:元组,第一个元素为受影响的行数

books = models.Book.objects.filter(pk=8).first().delete()
  • 方式二:使用QuerySet类型数据.delete()

返回值:元组,第一个参数为受影响的行数

books = models.Book.objects.filter(pk__in=[1, 2]).delete()

注:

1、Django删除数据时,会模仿SQL约束ON DELETE CASCADE的行为,也就是删除一个对象也会删除与它相关两的外键对象。

2、delete()方法是QuerySet数据类型的方法,但并不适用于Manager本身。想要删除所有数据,不能不写all。

books=models.Book.objects.delete()  # 报错
books=models.Book.objects.all().delete()   # 删除成功

修改

  • 方式一
模型类的对象.属性 = 更改的属性值
模型类的对象.save()

返回值:编辑的模型类的对象

方式二:QuerySet类数据 update(字段名=更改的数据)

返回值:整数,受影响的行数

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

def add_book(request):
    books = models.Book.objects.filter(pk__in=[7, 8]).update(price=888)
    return HttpResponse(books)

你可能感兴趣的:(django)