模型关系

1:1 一对一 (一个身份证对应一个驾照)

  • 是使用外键+唯一约束实现的
  • 对应最多只能有一个
  • 我们通常会在从表中声明关系
    • 主表,从表
  • 主表数据删除,从表数据级联删除
  • 从表数据删除,主表不受影响
  • 谁声明关系,谁就是从表
 driver_idcard = models.OneToOneField(IDCard,on_delete=models.PROTECT)
  • 主表获取从表数据,是通过隐性属性,隐性属性的名字 默认是从表名字小写
  print(idcard.drivercard.driver_lever)
  • 从表获取主表数据,是通过显性属性
print(dc.driver_idcard.id_name)

1:M(一个人对应多辆车)

  • 使用外键实现的
  • 主表获取从表是隐性属性,隐性属性是Manager的子类
    • 支持

      • all
      • filter
      • first
      • last
  • 数据删除和一对一一样
  - 从表获取主表数据,是通过显性属性idcard = car.c_idcardprint(idcard.id_name- 主表获取从表数据,是通过隐性属性,隐性属性的名字 默认是从表名字小写idcard = IDCard.objects.last()cars = idcard.car_set.last()

实例

models.py

from django.db import models# Create your models here.
class IDCard(models.Model):id_num = models.CharField(max_length=32,unique=True)id_name = models.CharField(max_length=32)class DriverCard(models.Model):diver_leverl = models.CharField(max_length=16)driver_idcard = models.OneToOneField(IDCard,on_delete=models.PROTECT)class Car(models.Model):c_type = models.CharField(max_length=32)c_idcard = models.ForeignKey(IDCard,null=True)

view.py

import random
import uuidfrom django.http import HttpResponse
from django.shortcuts import render# Create your views here.
from RelationLearn.models import IDCard, DriverCard, Cardef index(request):return HttpResponse("three index")def add_idcard(request):id_card = IDCard()id_card.id_num = random.randrange(10000000000)id_card.id_name = uuid.uuid4().hexid_card.save()return HttpResponse("add new id card ok")def add_dc(request):dc = DriverCard()dc.diver_level = "c1"id_card = IDCard.objects.last()dc.driver_idcard =id_carddc.save()return HttpResponse("add killer  ok")def delete_idcard(request):id_card = IDCard.objects.last()id_card.delete()return HttpResponse("del idcard  ok")def del_dc(request):dc_card = DriverCard.objects.last()dc_card.delete()return HttpResponse("del dc  ok")def get_idcard(request):dc= DriverCard.objects.last()print(dc.driver_idcard.id_name)return HttpResponse("by carid get id")def get_dc(request):idcard= IDCard.objects.last()print(idcard.drivercard.driver_lever)return HttpResponse("by id get carid")def get_idcard_form_car(request):car =Car.objects.last()idcard = car.c_idcardprint(idcard.id_name)return HttpResponse("by car gei id ")def get_car(request):idcard = IDCard.objects.last()cars = idcard.car_set.last()for car in cars:print(car)car_single = idcard.car_set.first()print(car_single.c_type)return HttpResponse("get cars by id")def add_car(request):# car = Car()# car.c_type = "tiganche"# idcard = IDCard.objects.last()# car.c_idcard = idcard# car.save()car = Car()car.c_type = "olddriver"car.save()idcard = IDCard.objects.last()idcard.car_set.add(car)return HttpResponse("add car ")
  • M:N

    • 使用额外的关系表进行数据记录
    • 关系表使用两个外键实现的
from django.db import models# Create your models here.
class BlogUser(models.Model):u_name =models.CharField(max_length=32)class Blog(models.Model):b_title =models.CharField(max_length=64)b_content =models.TextField()b_user_collect =models.ManyToManyField(BlogUser)

views.py

from django.http import HttpResponse
from django.shortcuts import render# Create your views here.
from ManyLearn.models import *def index(request):return HttpResponse("index many")def add_collect(request):# blog = Blog.objects.last()# # blog= Blog()# user =BlogUser.objects.first()# blog.b_user_collect.add(user)# return HttpResponse("add collect")blog = Blog.objects.last()user = BlogUser.objects.last()user.blog_set.add(blog)return HttpResponse("add collect")def del_collects(request):blog = Blog.objects.all()user = BlogUser.objects.get(id = "3")user.blog_set.remove(*blog)return HttpResponse("del collects ok")
# 查询指定用户的收藏的所有博客
def get_usercollects(request):user = BlogUser.objects.first()# print(user.blog_set.all().values())collections = user.blog_set.all()return render(request,"AllCollects.html",context=locals())
# 查询指定博客被哪些用户收藏了
def get_user(request):blog = Blog.objects.first()# blog=Blog()users = blog.b_user_collect.all()return render(request,"AllCollectsUser.html",context=locals())

模型级联操作

  • CASECADE

    • 默认模式
    • 默认级联删除
  • PROTECT
    • 保护模式
    • 存在级联数据就不能删除
    • 不存在级联数据就可以删除
  • SET
    • 设置为某值
    • NULL
      • 字段允许为空
    • DEFAULT
      • 字段存在默认值
    • VALUE
      • VALUE是真实的值

Django模型关系相关推荐

  1. Django模型中的关系:一对一、一对多与多对多

    Django模型中的关系:一对一.一对多与多对多 数据库中的表存在关联关系,Django中的模型对应数据库中的表,因此Django中的模型也存在一对一.一对多与多对多这三种关系. 1 . 一对一关系 ...

  2. 20.Django模型映射关系

    Django模型映射关系 三大知识点: 模型类必须都写在app下的models.py文件中. 模型如果需要映射到数据库,所在的app必须注册. 一个数据表对应一个模型类,表中的字段,对应模型中的类属性 ...

  3. Django ORM – 多表实例:Django模型Model的定义+模型间关系

    Django 对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle. Django 为这些数据库提供了统一的调用API. 我们可以根据自己业务需求选择不同的 ...

  4. Django模型层Meta内部类详解

    Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.以下对此作一总结: abstract      这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会对应 ...

  5. 4Python全栈之路系列之Django模型

    Python全栈之路系列之Django模型 MTV开发模式 把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的Model-View-Controller(MVC)模式.在这个模式中 ...

  6. 【Django】MTV(Django)模型

    MTV(Django)模型 MVC模型 MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视 ...

  7. Web开发-Django模型层

    Django模型层 简述 Django框架处理业务的逻辑一般如下(省略图,源于网络,侵删) 可以看到,Django自带了一套ORM机制,这也是Django框架的核心-"全面",将一 ...

  8. Django模型(三)

    Django模型(三) 文章目录 Django模型(三) 一.模型类关系 1.关系字段类型 2.一对多关系 3.多对多关系 二.关联查询 1.通过对象执行关联查询 2.通过模型类执行关联查询 三.自关 ...

  9. Django模型(二)

    Django模型(二) 文章目录 Django模型(二) 一.字段查询 1.查看mysql数据库日志 二.条件运算符 1.查询等 2.模糊查询 3.空查询 4. 范围查询 5. 比较查询 6).日期查 ...

最新文章

  1. 在PHP语言中使用JSON
  2. POJ 1039 Pipe
  3. V3S中默认时区设置(笔记)
  4. 巴菲特的价值投资的第二版本
  5. 【Python基础】盘点 Python 10 大常用数据结构(上篇)
  6. C语言变长数组data[0]【总结】
  7. 概念性jQuery内容编辑器
  8. web-基础入门-web框架-web服务器-wsgi接口
  9. 如何使用recordMyDesktop录制截屏视频
  10. 人工智能应用在会计工作中的优势
  11. postfix+web页面+身份验证
  12. 如何在Excel中快速调整列宽
  13. VMware Horizon 8 2106 -- 用于管理虚拟桌面 (VDI)、应用和在线服务的领先平台
  14. 《不花钱学法语》--18个网站,强化法语六力
  15. QCustomplot(五)QCPAxisRect进行子绘图
  16. excel计算二元线性回归_用人话讲明白梯度下降Gradient Descent(以求解多元线性回归参数为例)...
  17. 计算机运维管理竞赛,设备管理维护技能竞赛试题.doc
  18. 2022年全国PMP考试地点汇总,你都知道吗?
  19. 判断输入是否为回车键
  20. PyG基于Node2Vec实现节点分类及其可视化

热门文章

  1. 15条常用的视频音频编辑脚本命令(mencoder/ffmpeg等)
  2. MySQL 实现树形的遍历(关于多级菜单栏以及多级上下部门的查询问题)
  3. 根据库位获取仓库id
  4. js关于表单校验完善
  5. vue根据数组对象中某个唯一标识去重
  6. 快速解决 GRADLE 项目下载 gradle-*-all.zip 慢的问题
  7. 2018 年,React 将独占web前端框架鳌头?
  8. LinkedList类源码浅析(二)
  9. javascript设计模式-继承
  10. oracle RAC切换归档