一、一对一

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

优点:提高效率

实质:唯一的外键

# 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. zeppelin开启多个

    conf/zeppelin-env.sh 添加行: export ZEPPELIN_PID_DIR=/xx/zeppelin/run_2

  2. H3C 域名解析显示及维护

  3. MSBuild 常用参数

    本文告诉大家在 MSBuild 里面常用的参数 一般的 msbuild 在编译的时候都会添加很多参数,用法如下 进入对应编译的 sln 或 csproj 文件所在的文件夹,执行下面命名 msbuild ...

  4. H3C ping命令的输出

  5. Storm使用总结

    Strom安装 Strom启动 ./zkServer.sh start 启动nimbus主节点: nohup bin/storm nimbus >> /dev/null & 启动s ...

  6. Android Simulator Shortcut keys

    按钮 快捷键 Back Ctrl+Backspace Battery Ctrl+Shift+B Cellular Ctrl+Shift+C D-pad Ctrl+Shift+D Enter zoom ...

  7. Keras mlp 手写数字识别示例

    #基于mnist数据集的手写数字识别 #构造了三层全连接层组成的多层感知机,最后一层为输出层 #基于Keras 2.1.1 Tensorflow 1.4.0 代码: import keras from ...

  8. HDU 2899 Strange fuction [二分]

    1.题意:给一个函数F(X)的表达式,求其最值,自变量定义域为0到100 2.分析:写出题面函数的导函数的表达式,二分求导函数的零点,对应的就是极值点 3.代码: # include <iost ...

  9. To learns

    1. avro https://www.jianshu.com/p/ecbb607809c4

  10. mac 访达修改所有文件夹默认排序方式

    先说个误区,下图只能改变当前目录的排序方式 修改所有目录的排序方式需要在顶部的“显示” 中修改