肆拾柒 --- 模型层

django模型层

一、单表查询

? 创建一个图书列表:

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digital=8,,decimal_places=2)
    publish_dta = models.DateField()

? 增:

models.Bool.objects.create(title = '活着',price = 50,publish_data = '2010.01.01')
book_obj = models.Book(title = '三国',price = 48.8,publish_data = '2018.01.01')
book_obj.save()

? 改:

models.Book.objects.filter(pk=1).update(price = 55.5)
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.title = '三国演义'
book_obj.save()

? 删:

models.Book.objects.filter(pk=1).delete()

1.1 必知必会的十三条

1.1.1 .all()

res = models.Book.objects.all()     #惰性查询
print(res)              # 不调用,不查询,没有输出结果
for i in res:
    print(i.title)          # 有结果

1.1.2 .filter(**kwargs)

res = models.Book.objects.filter(pk=2)  # 参数为过滤条件
print(res)   # 返回queryset对象

1.1.3 .get(**kwargs)

book_obj = models.Book.objects.get(pk=1)
print(book_obj)   #返回值为空会报错

1.1.4 .first()

res = models.Book.objects.all()
print(res.first())  # 拿到第一个

1.1.5 .last()

res = models.Book.objects.all()
print(res.last())  # 拿到最后一个

1.1.6 .exclude(**kwargs)

res = models.Book.objects.exclude(pk=3).filter(pk=4)
print(res)   # 返回queryset对象

1.1.7 .values(**kwargs)

res = models.Book.objects.values('title')
print(res)    # 返回queryset对象,列表套字典结构

1.1.8 .values_list(**kwargs)

res = models.Book.objects.values_list('title')
print(res)     # 返回queryset对象,列表套元组结构

1.1.9 .count()

res = models.Book.objects.count()
res1 = models.Book.objects.all().count()
print(res,res1)   # 返回统计个数

1.1.10 .distinct()

# 去重:数据必须是一模一样的情况下才能去重
res = models.Book.objects.all().distinct()
ress = models.Book.objects.values('title').distinct()

1.1.11 order_by(**kwargs)

res = models.Book.Objects.order_by('price') 默认是升序
res1 = models.Book.objects.order_by('-price')

1.1.12 .reverse()

# 前面必须是先结果排序才可以反转
res = models.Book.objects.order_by('price').reverse()

1.1.13 .exists()

res = models.Book>object.filter(pk=1).exists() #没卵用

1.2 双下划线查询

? 查询价格大于200的书:

res = models.Book.objects.filter(price__gt=200)

? 查询价格小于200的书:

res = models.Book.objects.filter(price__lt=200)

? 查询价格大于等于(小于等于)200的书:

res = models.Book.objects.filter(price__gte)
res1 = models.Book.objects.filter(price__lte)

? 查询价格是200或50或100的书:

res = models.Book.objects.filter(priec__in=[200,50,100])

? 价格在200 到700之间的书籍:

res = models.Book.object.filter(price_range=(200,700))

? 查询书名中有p的:

res = models.Book.objects.filter(title__contains='p')#区分大小写
res = models.Book.objects.filter(title__contains='p')#不区分大小写

? 查询书籍中以三开头的:

res = models.Book.objects.filter(title__startswith='三')
res1 = models.Book.objects.filter(title__endswith='P')

? 查询出版日期是2010年的:

res = models.Book.object.filter(publish_date__year='2010')

二、多表查询

? 创建图书、出版社、作者、作者信息多个表:

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    publish_date = models.DateField(auto_now_add=True)
    publish = models.ForeignKey(tp='Publish')
    authors = models.ManyToManyField(to='Author')

    def __ser__(self):
        return self.title

class Publish(models.Model):
    name = models.Charfield(max_length=32)
    addr = models.Charfield(max_length=64)

    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.Charfield(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to='AuthorDetail')

    def __str__(self):
        return self.name

class AuthorDetail(models.Model):
    phone = models.BigInterField()
    addr = models.CharField(max_length=64)

    def __ser__(self):
        return self.addr

2.1 一对多字段增删改查

? 增:

models.Book.objects.create(title='西游记',price=88,publish_id=1)
# publish_id直接传出版社主键值

publish_obj = models.Publish.object.filter(pk=2).first()
models.Book.objects.creat(title='红楼',price=63,publish=publish_obj)
# publish直接传出版社数据对象

? 删:

models.Pubilsh.objects.filter(pk=2).delete()  #默认是级联更新 级联删除

? 查:

book_obj = models.Book.models.filter(pk=1).first()
res = book_obj.publish
res1 = book_obj.publish_idrrr

2.2 多对多字段增删改查

? 给主键为3的书籍添加两个作者 1 2:

book_obj = models.Book.objects.filter(pk=3).first()
book_obj.authors.add(1,2)

author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.authors.add(author_obj,author_obj1)

? 修改关系:

book_obj = models.Book.objects.filter(pk=3).first()
book_obj.authors.set([3,])
book_obj.authors.set([1,3])
author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.authors.set((author_obj,))
book_obj.authors.set((author_obj,author_obj1))

? 删除:

book_obj = models.Book.objects.filter(pk=3).first()
book_obj.authors.remove(2)
book_obj.authors.remove(1,2)

author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.authors.remove(author_obj)
book_obj.authors.remove(author_obj,author_obj1)

? 清空:

book_obj = models.Book.objects.filter(pk=3).first()
book_obj.authors.clear()

2.3 跨表查询

? 正向查询:外键字段在谁那儿 由谁查谁就是正向;

? 反向查询:谁手里有外键字段 谁就是正向查

? 方法:正向查询按字段,反向查询按表名小写 。

2.3.1 基于对象

? 查询书籍是python入门的出版社名称:

book_obj = models.Book.objects.filter(title='python入门').first()
    # # 正向查询按字段
print(book_obj.publish.name)

? 查询书籍主键是6的作者姓名:

book_obj = models.Book.objects.filter(pk=6).first()
print(book_obj.authors.all())
#正向查询,按字段.当该字段所对应的数据有多个的时候 需要加.all(),否则点外键字段直接就能够拿到数据对象。

? 查询出版社是东方出版社出版过的书籍:

publish_obj = models.Publish.objects.filter(name='东方出版社').first()
print(publish_obj.book_set.all())

? 查询作者是jason写过的所有的书:

author_obj = models.Author.objects.filter(name='jason').first()
print(author_obj.book_set.all())

? 查询手机号是110的作者

author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
print(author_detail_obj.author)
print(author_detail_obj.author.name)

? 注意:当查询的结果可以是多个的情况下 需要加_set.all();当查询的结果有且只有一个的情况下 不需要加任何东西 直接表名小写即可。

? 查询书籍是python入门的作者的手机号:

book_obj = models.Book.objects.filter(title='python入门').first()
print(book_obj.authors.all())

2.3.2 基于双下划綫的跨表查询

? 查询书籍是python入门的出版社名称:

#正向
res = models.Book.objects.filter(title='python入门').values('publish__name')
print(res)
    # 反向
res = models.Publish.objects.filter(book__title='python入门').values('name')
print(res)

? 查询作者是jason的手机号码:

# 正向
res1 = models.Author.objects.filter(name='jason').values('author_detail__phone')
print(res1)
# 反向
res = models.AuthorDetail.objects.filter(author__name='jason').values('phone','author__age')
 print(res)

? 查询手机号是120的作者姓名:

res2 = models.AuthorDetail.objects.filter(phone=120).values('author__name')
print(res2)
res = models.Author.objects.filter(author_detail__phone=120).values('name','author_detail__addr')
print(res)

? 查询出版社是东方出版社出版的书籍名称:

res = models.Publish.objects.filter(name='东方出版社').values('book__title','addr')
print(res)

? 查询作者是jason的写过的书的名字和价格:

res = models.Author.objects.filter(name='jason').values('book__title','book__price')
print(res)

? 查询书籍是python入门的作者的手机号:

res = models.Book.objects.filter(title='python入门').values('authors__author_detail__phone')
print(res)

原文地址:https://www.cnblogs.com/tangceng/p/11735588.html

时间: 2024-10-29 22:25:01

肆拾柒 --- 模型层的相关文章

肆拾捌 --- 模型层下

django模板层下 一.聚合查询与分组查询 1.1 聚合 ? 聚合函数是sql的基本函数,会对一组值执行计算并返回单一的值. from django.db.models import Avg,Sun,Max,Min,Count res1 = models.Book.objects.all().aggregate(Avg('price')) res2 = models.Book.objects.all().aggregate(Max('price')) res3 = models.Book.ob

TP框架---Model模型层---做模型对象

TP框架----Model模型层---------------做模型对象 Model模型层是用来做什么的呢???? 主要是用来做操作数据库访问的. 也就说明TP框架自带了一种访问数据库的方式,使用的是Model模型. Model模型怎样使用呢??? 要使用Model模型层访问数据库的话,需要做配置,因为必须把数据库的一些参数配置好之后,才能连接,所以找到Config.php 配置文件,打开 这些是关于数据库的配置, 要把这些粘贴到config.php 进行修改. config.php配置文件(修

Django的模型层

Django模型层是Django框架自己定义的一套独特的ORM技术.使用django模型开发的首要任务就是定义模型类及其属性.每个模型类都可以被映射为数据库中的一个数据表,而类属性被映射数据字段,除此之外,数据库表的主键.外键.约束等也通过类属性完成定义. 1.模型定义,通过模型类中的Mata子类定义数据模型,比如数据库的表名.数据默认排序方式等. 2.普通字段类型,普通字段类型指模型类中除了外键关系外的数据字段属性. 3.常用字段参数,每个字段类型都有一些特定的HTML标签和表单验证参数, 4

模型层的生成

在[CodeSmith快速入门之三:数据库我来了]中,我们介绍了对数据库的基本访问,在本章将会带大家进行模型层的编写. 首先先要了解模型层(实体层.VO层)的组成,如下所示:public class 实体名{    私有字段声明;    构造函数;    公共属性;}注:--私有字段声明:一般是先声明主键,再是非主键字段,骆驼命名法(首字母小写,新单词首字母大写)--公共属性:一般是先声明主键,再是非主键属性,帕斯卡命名法(首字母大写,新单词首字母大写) 1.创建C#模板并保存,取名为Model

tp框架-----Model模型层

1.Model模型层是用来做什么的呢? 主要是用来做操作数据库访问的.也就说明TP框架自带了一种访问数据库的方式,使用的是Model模型. 2.Model模型怎样使用呢? 要使用Model模型层访问数据库的话,需要做配置,因为必须把数据库的一些参数配置好之后,才能连接,所以找到Config.php.    如何修改配置呢? 1)打开下图路径中的Convention.php文件 2)复制convention.php中的下图内容到Home/Conf/config.php中 3)修改配置,将自己的数据

BIEE入门(三)业务模型层

正如它的名字所示(Business Model and Mapping Layer),业务逻辑层需要把物理层的数据源以一种业务用户的视角来重新组织物理层的各个数据源(所谓的Mapping),同时在业务逻辑层里,我们将 需要真正构建数据仓库里的星型模型,包括: ·         事实表 ·         维表 ·         维表的层次结构(hierarchy) ·         事实表度量(measure)来提供一个模型供展现层使用,所以在业务逻辑层,用户需要同时具有技术的知识(数据仓

模型层TP框架数据库的操作

在shop入口的文件下的HOME文件夹中使用模型层 第一步修改配置模块把数据库的各种链接做好,打开HOME中的conf文件夹中的config.php,找到Thinkphp文件加下的conf文件打开convention.php找到关于数据库的配置文件 在开发的时候需要把字段缓存打成flase: 第二部做模型层,在HOME文件夹中打开Model文件中写数据模型参照contrller控制器来写,建一个model的类文件(InfoModel.class.php)嵌入PHP代码 显示结果 2. 使用D 方

再探 Ext JS 6 (sencha touch/ext升级版) 变化篇 (编译命令、滚动条、控制层、模型层、路由)

从sencha touch 2.4.2升级到ext js 6,cmd版本升级到6.0之后发生了很多变化 首先从cmd说起,cmd 6 中sencha app build package不能使用了,sencha app build native好像也不能用了. 有个好消息就是我们可以用sencha ant native buildsencha ant package build 这两个命令,目测和以前的效果差不多了 然后再说说ext js 6相对sencha touch 2.4.2的变化 首先最只

论Model(模型层)的过度封装

曾经我架构的层次安排为 Entity(实体层),Repository(持久化层),DTO(搜索对象层) Model(模型层),Service(服务层) 拦截层 (Control)控制层 Model模型层的依赖关系:Entity,Service public class MArticleList { public List<Article> list { get; set; } public DArticle dto { get; set; } public MArticleList() { l