一、一对一

场景:字段多,且一部分字段使用率高

优点:提高效率

实质:唯一的外键

# 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的更多相关文章

  1. ORM基础知识

    ORM基础知识 一.什么ORM? ORM是Object Relactional Mapping的缩写,即对象关系映射,是将关系型数据库中的数据库结构映射成对象,就可以通过面向对象思想编程. 二.常用的 ...

  2. 深入理解Magento – 第四章 – 模型和ORM基础

    深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第四章 – 模型和ORM基础 对于任何一个MVC架构,模型(Model)层的实现都是占据了很大一部分.对于Mage ...

  3. day 67 django 之ORM 基础安装

    一 ORM的基础部分 1 ORM的概念 对象关系映射(Object Relational Mapping(映射),简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 2   ...

  4. Magento模型和ORM基础

    对于任何一个MVC架构,模型(Model)层的实现都是占据了很大一部分.对于Magento来说,模型占据了一个更加重要的位置,因为它常常包含了一部分商业逻辑代码(可以说它对,也可以说它错).这些代码在 ...

  5. Django之ORM基础

    ORM简介 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  6. ORM基础之ORM介绍和基础操作

    一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过 ...

  7. ORM基础之字段及其参数介绍

    一.外键ForeignKey 1.字段参数 1.to 设置要关联的表 2.to_field 设置要关联的表的字段(一般不设置,默认使用主键id关联) 3.related_name 反向操作时,使用的字 ...

  8. Django models ORM基础操作--白话聊Django系列

    上次我们讲完了views视图,那我们这次来看一下Django强大的ORM,可以这么说,你不懂Django的ORM,你就不懂Django,那废话不多说 ORM又称关系对象映射,在ORM里,一张表就是一个 ...

  9. Python orm基础

    ORM 对象映射关系程序. 通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sq ...

  10. .NET进阶——ORM基础认识

    ORM对象关系映射,对象即实体,关系即关系数据库表.ORM即实现从实体对象关系数据库数据的映射. 本质上就是将数据从一种形式转换到还有一种形式.它详细又有哪些表现呢.咱们一步步学习,一步步分析. OR ...

随机推荐

  1. AMD-require.js模块加载原理

    项目中使用大了require.js,功能实现,现重新学习下模块加载原理相关知识,借鉴如下博文:https://blog.csdn.net/ai52011/article/details/7711361 ...

  2. H3C配置Trunk端口

  3. activiti工作流引擎学习(三)

    5.接收任务活动(receiveTask,即等待活动)不是一个任务节点 接收任务是一个简单任务,他会等待回应消息的到达,当前,官方只实现了这个任务的java语义,当流程达到接受任务,流程状态会保存到数 ...

  4. location对象相关

    JS是由DOM(文档对象模型).BOM(浏览器对象模型).以及ECMA组成,而location对象是BOM中的一个非常重要的对象,所有关于地址栏信息的内容都在这里.了解location对象之前让我们先 ...

  5. Canal常用配置

    Canal 是mysql数据库binlog的增量订阅&消费组件. 基于日志增量订阅&消费支持的业务: 数据库镜像 数据库实时备份 多级索引 (卖家和买家各自分库索引) search b ...

  6. HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap的区别

    Map是Java最常用的集合类之一.它有很多实现类,我总结了几种常用的Map实现类,如下图所示.本篇文章重点总结几个Map实现类的特点和区别: 特点总结: 实现类 HashMap LinkedHash ...

  7. $SP703\ Mobile\ Service\ DP$

    洛谷 Sol 首先状态是已经完成的请求数量 这题只有三个员工跑来跑去,只有三个.... 一般像这种人数特别少的DP题就会把它们都放到状态里去 于是:f[i][x][y][z]表示现在已经完成了i个请求 ...

  8. Callable,阻塞队列,线程池问题

    一.说说Java创建多线程的方法 1. 通过继承Thread类实现run方法   2. 通过实现Runnable接口 3. 通过实现Callable接口 4. 通过线程池获取 二. 可以写一个Call ...

  9. 1092 最好吃的月饼 (20分)C语言

    月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种. 若想评比出一种"最好吃"的月饼,那势必在吃货界引发一场腥风血雨-- 在这里我们用数字说话,给出全国各地各种月饼的 ...

  10. 对 Redux 一头雾水?看完这篇就懂了

    首先,学习 Redux 可能会很困难 当你终于学会了如何使用 React,也有了自己去构建一些应用的信心,那会是一种非常棒的感觉.你学会了管理状态,一切看起来井井有条.但是,很有可能这就到了你该学习 ...