ORM基础5
一、一对一
场景:字段多,且一部分字段使用率高
优点:提高效率
实质:唯一的外键
# Person表
class Person(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, null=False, unique=True)
sex = models.CharField(max_length=8, null=False)
# Django2.0 要添加on_delete
details = models.OneToOneField(to="PersonDetails", on_delete=models.CASCADE) # PersonDetails
class PersonDetails(models.Model):
hobby = models.CharField(max_length=32, null=False)
addr = models.CharField(max_length=64, null=False)
# 正向QuerySet查找 字段
ret = models.Person.objects.filter(id=1).values_list('details__hobby')
print(ret)
# 反向QueerySet查找 表名
ret = models.PersonDetails.objects.filter(addr="徐州").values("person__name")
print(ret)
二、多对多创建的方式
1、ManyToManyField,自动创建第三张表
优点:简单、方便
缺点:不能在第三张表添加额外的字段
2、自己创建第三张表,利用外键分别关联
缺点:麻烦、并且不能使用ORM的内置方法,所有一般不用这种方法
3、ManyToManyField,指定第三张表
优点:查询方便,第三张表可以自定义字段
缺点:第三张表自定义字段后,无法使用create、add、set等方法,需要通过第三张表直接操作
# 书
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=16, null=False, unique=True)
price = models.DecimalField(max_digits=4, decimal_places=2) # 作者
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=8, null=False, unique=True)
books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book")) # 作者to书
class Author2Book(models.Model):
id = models.AutoField(primary_key=True)
author = models.ForeignKey(to="Author", on_delete=models.CASCADE)
book = models.ForeignKey(to="Book", on_delete=models.CASCADE)
data = models.DateField(auto_now_add=True) class Meta:
# 作者和书设置联和唯一
unique_together = ("author", "book")
# 正向QuerySet查询 字段
ret = models.Author.objects.filter(id__gt=1).values("books__title", "books__price")
print(ret)
print('去重'.center(80, '-'))
print(ret.distinct())
# 反向SquerySet查询 表名
ret = models.Book.objects.filter(id=1).values_list("author__name")
print(ret)
三、csrf的简单用法(POST请求)
csrf (Cross-site request forgery)跨站请求伪造
实质:添加一个动态隐藏标签,提交的时候网站要做比较
在form表单中添加:
{% csrf_token %}
return render(request, "real.html")
request, 每次返回一个新值 去改变csrf_token
四、补充
1、select_related()
# 用于一对一,多对一
# 提高效率
2、prefetch_related()
# 用于多对多
# 提高效率
3、bulk_create()
# 批量创建
ORM基础5的更多相关文章
- ORM基础知识
ORM基础知识 一.什么ORM? ORM是Object Relactional Mapping的缩写,即对象关系映射,是将关系型数据库中的数据库结构映射成对象,就可以通过面向对象思想编程. 二.常用的 ...
- 深入理解Magento – 第四章 – 模型和ORM基础
深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第四章 – 模型和ORM基础 对于任何一个MVC架构,模型(Model)层的实现都是占据了很大一部分.对于Mage ...
- day 67 django 之ORM 基础安装
一 ORM的基础部分 1 ORM的概念 对象关系映射(Object Relational Mapping(映射),简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 2 ...
- Magento模型和ORM基础
对于任何一个MVC架构,模型(Model)层的实现都是占据了很大一部分.对于Magento来说,模型占据了一个更加重要的位置,因为它常常包含了一部分商业逻辑代码(可以说它对,也可以说它错).这些代码在 ...
- Django之ORM基础
ORM简介 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
- ORM基础之ORM介绍和基础操作
一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过 ...
- ORM基础之字段及其参数介绍
一.外键ForeignKey 1.字段参数 1.to 设置要关联的表 2.to_field 设置要关联的表的字段(一般不设置,默认使用主键id关联) 3.related_name 反向操作时,使用的字 ...
- Django models ORM基础操作--白话聊Django系列
上次我们讲完了views视图,那我们这次来看一下Django强大的ORM,可以这么说,你不懂Django的ORM,你就不懂Django,那废话不多说 ORM又称关系对象映射,在ORM里,一张表就是一个 ...
- Python orm基础
ORM 对象映射关系程序. 通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sq ...
- .NET进阶——ORM基础认识
ORM对象关系映射,对象即实体,关系即关系数据库表.ORM即实现从实体对象关系数据库数据的映射. 本质上就是将数据从一种形式转换到还有一种形式.它详细又有哪些表现呢.咱们一步步学习,一步步分析. OR ...
随机推荐
- H3C配置BPDU的生成和传递
- MV*模式
MV*模式 MVC框架最早出现在Java领域,然后慢慢在前端开发中也被提到,后来又出现了MVP,以及现在最成熟的MVVM. MVC model 数据模型 view 视图 controller 控制器 ...
- excel转换成实体
package com.cinc.ecmp.utils; import java.io.IOException; import java.io.InputStream; import java.lan ...
- import()函数
简介 import命令会被 JavaScript 引擎静态分析,先于模块内的其他模块执行(叫做”连接“更合适).所以,下面的代码会报错. // 报错 if (x === 2) { import MyM ...
- SPA+.NET Core3.1 GitHub第三方授权登录 使用AspNet.Security.OAuth.GitHub
GitHub第三方授权登录 使用SPA+.NET Core3.1实现 GitHub第三方授权登录 类似使用AspNet.Security.OAuth.GitHub,前端使用如下:VUE+Vue-Rou ...
- javascript 闭包的理解(一)
过很多谈如何理解闭包的方法,但大多数文章,都是照抄或者解释<Javascript高级程序设计(第三版)>对于闭包的讲解,甚至例程都不约而同的引用高程三181页‘闭包与变量’一节的那个“返回 ...
- 基于python的分治法和例题
分治法 分治法的核心 分:将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题 治:最后的子问题,可以很容易的直接求解 合:所有子问题的解合并起来就是原问题的解 分治法的特征 ...
- 开发者请注意:Python2 的最后版本将于 4 月发布,但它确实是在 1 月 1 日就寿命终止了!
2020 年 1 月 1 日是 Python2 的寿命终止日,这个日期在两年前经"Python之父" Guido van Rossum 宣布,此后一直成为开发者社区翘首以盼的一天. ...
- DRF框架中分页功能接口
目录 DRF框架中分页功能接口 DRF框架中分页功能接口 一.在框架中提供来三个类来实现分页功能,PageNumberPagination.LimitOffsetPagination.CursorPa ...
- JS进阶——this绑定了谁?
一.this的意义 二.寻找this绑定对象 经常听到这么一句话,找this只需要看谁是调用方.当函数被调用时会记录函数调用调用方式.传参包括this等各种属性.有时候this绑定对象情况太抽象,找到 ...