一、一对一

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

优点:提高效率

实质:唯一的外键

# 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. 2019-6-5-WPF-隐藏系统窗口菜单

    title author date CreateTime categories WPF 隐藏系统窗口菜单 lindexi 2019-06-05 17:26:44 +0800 2019-06-05 17 ...

  2. H3C 链路聚合显示及维护

  3. vue 弹窗时 监听手机返回键关闭弹窗(页面不跳转)

    [注]:  popstate 事件 a.当活动历史记录条目更改时,将触发popstate事件. b.如果被激活的历史记录条目是通过对history.pushState()的调用创建的,或者受到对his ...

  4. POJ 2387 Til the Cows Come Home(最短路模板)

    题目链接:http://poj.org/problem?id=2387 题意:有n个城市点,m条边,求n到1的最短路径.n<=1000; m<=2000 就是一个标准的最短路模板. #in ...

  5. Lede定时重拨

    系统,计划任务,   0 4 * * * ifup wan 梅林定时重拨: #! /bin/sh #断开拨号连接 killall pppd #延时10秒 #重新拨号 pppd >& &a ...

  6. linux上传文件的命令

    由于svm挂机不能通过svn提交代码,所以今天尝试了一下linux的rz和sz命令 1.sz命令是把文件下载到本地,使用方法如下 sz  文件名 回车之后会弹出一个本地的路径选择框,选择要下载的路径即 ...

  7. 博客同步到CSDN客户端

    同步本人博客到CSDN客户端 http://blog.csdn.net/johnnyz1234

  8. java后台防止sql注入的方法

    1.采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可: String sql= "select * from users where usernam ...

  9. Android Drawable - Shape Drawable使用详解(附图)

    TIPS shape图形 –简单介绍 shape图形 –如何画? shape图形 –参数详细解析 shape图形 –如何用? shape图形 –实际开发应用场景 shape图形简单介绍 用xml实现一 ...

  10. 【游记】THUWC2019-2 Bystander

    [游记]THUWC2019-2 Bystander Day0/-1 感觉自己怎么样都去不了PKUWC(没错)了,差点放弃模拟面试,在老妈的要求下勉强面试,自我介绍没怎么准备,然后就说 我喜欢唱跳Rap ...