三篇文章带你了解基础、进阶、高端篇Django ORM操作(基础)

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

本文章来自腾讯云 作者:Python进阶者

前言
在日常开发中,需要大量对数据库进行增删改查操作。

如果头铁的话,使用原生SQL是最好的,毕竟性能又高,又灵活。

但是通常情况下,我们不是太需要那么苛刻的性能,也没有那么多***钻的需求用原生SQL

通常会使用简单快捷的ORM进行增删改查

一起看学习一下Django的ORM操作吧

表结构设计
还是从实际角度出发。

假设,现在我需要设计一个简单的图书管理系统,是那种买的书,不是图书馆的书!!!

我想了想,首先,肯定有一个图书表,专门存放图书的信息,最起码是这样的。
在这里插入图片描述
但是又想了想,似乎我的书想发布,肯定是需要一个出版社帮我发布的,我肯定不能自己发布所以是这样子的。
在这里插入图片描述
又想了想,书肯定是人写的,肯定要有作者,所以还需要一个作者表,应该是这样子的。
在这里插入图片描述
又想了想,这一本书如果让一般人编,难度有点大啊,一般都是多人一起完成的,所以大概还有这样一张表。
在这里插入图片描述

其实,上述漏点了一个东西,图书需要归属一个出版社的,所以,最终表结构应该是这样的!

在这里插入图片描述
Django models代码

from django.db import models


# 作者表
class Author(models.Model):
    name = models.CharField(verbose_name="作者姓名", max_length=8)
    age = models.IntegerField(verbose_name="作者年龄")
    phone = models.CharField(verbose_name="作者联系方式", max_length=11)


# 出版社
class Publish(models.Model):
    title = models.CharField(verbose_name="出版社名称", max_length=16)
    phone = models.CharField(verbose_name="出版联系方式", max_length=11)


# 图书
class Book(models.Model):
    title = models.CharField(verbose_name="书名", max_length=32)
    price = models.DecimalField(verbose_name="价格", max_digits=5, decimal_places=2)
    PublishDate = models.DateField(verbose_name="初版日期")
    publish = models.ForeignKey(to=Publish, verbose_name="所属出版社", on_delete=models.CASCADE)


# 图书Many作者
class BookManyAuthor(models.Model):
    book = models.ForeignKey(to=Book, verbose_name="所属图书", on_delete=models.CASCADE)
    author = models.ForeignKey(to=Author, verbose_name="所属作者", on_delete=models.CASCADE)

 

在这里插入图片描述

前置导入

import os
import django

# django_orm_demo为我的项目名称
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_orm_demo.settings")
django.setup()

# 导入models一定要在 django.setup() 之后
from web import models

 

查询所有(all)
语法

models.<模型类>.objects.all()

 

例如:查询所有作者

author_list = models.Author.objects.all()
print(author_list)

 

执行结果

在这里插入图片描述
**例如:**查询所有图书,并且遍历详情

book_list = models.Book.objects.all()
for book in book_list:
    print(book.title, book.price, book.PublishDate, book.publish)

 

执行结果
查询指定条件(filter)
语法

models.<模型类>.objects.filter(<条件>)

 

例如:查询张三的信息

author = models.Author.objects.filter(name="张三")
print(author)
print(author.name)

 

执行结果
在这里插入图片描述
代码

author = models.Author.objects.filter(name="张三").first()
print(author,type(author))
print(author.name,author.phone)

 

执行结果
在这里插入图片描述
在这里插入图片描述
代码

# filter里面多个条件是and查询
author = models.Author.objects.filter(name="张三",age=22).first()
print(author,type(author))
print(author.name,author.phone)

 


执行结果

在这里插入图片描述

# 包含三
字段__contains="" # 原生SQL条件:where 字段 like "%三%"
# 以三开头
字段__startswith="" # 原生SQL条件:where 字段 like "三%"
# 以三结尾
字段__startswith="" # 原生SQL条件:where 字段 like "%三"
# 为空
字段__isnull=True # 原生SQL条件:where 字段 IS NULL
# 不为空
字段__isnull=False # 原生SQL条件:where 字段 IS NOT NULL
# in
字段__in=[1,2,3] # 原生SQL条件:where 字段 IN (1, 2, 3)
# >
字段__gt=1 # 原生SQL条件:where 字段 > 1
# >=
字段__gte=1 # 原生SQL条件:where 字段 >= 1
# <
字段__lt=1 # 原生SQL条件:where 字段 < 1
# <=
字段__lte=1 # 原生SQL条件:where 字段 <= 1
# 日期字段,年
日期字段__year=2020 # 原生SQL条件:where 日期字段 BETWEEN 2020-01-01 AND 2020-12-31
# 日期字段,月
日期字段__month=3 # 原生SQL条件:where EXTRACT(MONTH FROM 表名.日期字段) = 3
# 日期字段,天
日期字段__day=4 # 原生SQL条件:where EXTRACT(DAY FROM 表名.日期字段) = 4
# 时间比大小,|为或的意思
日期字段__gt|lt|...="2020-10-10" # 原生SQL条件:where 日期字段 > 2020-10-10
# 比大小还可以是时间类型
import datetime
日期字段__gt|lt|...=datetime.date(2020,10,10)# 同上
# 时间范围筛选
日期字段__range=("2020-01-01","2020-06-01") # 原生SQL条件:where 时间字段 BETWEEN 2020-01-01 AND 2020-06-01
日期字段__range=(datetime.date(2020,1,1),datetime.date(2020,6,1)) # 同上

 

在这里插入图片描述
代码

sql = models.Author.objects.filter(name="李四").query
print(sql)

 

执行结果
在这里插入图片描述
在这里插入图片描述

posted @ 2021-01-14 15:19  锦麟  阅读(110)  评论(0编辑  收藏  举报