Django模型关系
模型关系
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模型关系相关推荐
- Django模型中的关系:一对一、一对多与多对多
Django模型中的关系:一对一.一对多与多对多 数据库中的表存在关联关系,Django中的模型对应数据库中的表,因此Django中的模型也存在一对一.一对多与多对多这三种关系. 1 . 一对一关系 ...
- 20.Django模型映射关系
Django模型映射关系 三大知识点: 模型类必须都写在app下的models.py文件中. 模型如果需要映射到数据库,所在的app必须注册. 一个数据表对应一个模型类,表中的字段,对应模型中的类属性 ...
- Django ORM – 多表实例:Django模型Model的定义+模型间关系
Django 对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle. Django 为这些数据库提供了统一的调用API. 我们可以根据自己业务需求选择不同的 ...
- Django模型层Meta内部类详解
Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.以下对此作一总结: abstract 这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会对应 ...
- 4Python全栈之路系列之Django模型
Python全栈之路系列之Django模型 MTV开发模式 把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的Model-View-Controller(MVC)模式.在这个模式中 ...
- 【Django】MTV(Django)模型
MTV(Django)模型 MVC模型 MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视 ...
- Web开发-Django模型层
Django模型层 简述 Django框架处理业务的逻辑一般如下(省略图,源于网络,侵删) 可以看到,Django自带了一套ORM机制,这也是Django框架的核心-"全面",将一 ...
- Django模型(三)
Django模型(三) 文章目录 Django模型(三) 一.模型类关系 1.关系字段类型 2.一对多关系 3.多对多关系 二.关联查询 1.通过对象执行关联查询 2.通过模型类执行关联查询 三.自关 ...
- Django模型(二)
Django模型(二) 文章目录 Django模型(二) 一.字段查询 1.查看mysql数据库日志 二.条件运算符 1.查询等 2.模糊查询 3.空查询 4. 范围查询 5. 比较查询 6).日期查 ...
最新文章
- 在PHP语言中使用JSON
- POJ 1039 Pipe
- V3S中默认时区设置(笔记)
- 巴菲特的价值投资的第二版本
- 【Python基础】盘点 Python 10 大常用数据结构(上篇)
- C语言变长数组data[0]【总结】
- 概念性jQuery内容编辑器
- web-基础入门-web框架-web服务器-wsgi接口
- 如何使用recordMyDesktop录制截屏视频
- 人工智能应用在会计工作中的优势
- postfix+web页面+身份验证
- 如何在Excel中快速调整列宽
- VMware Horizon 8 2106 -- 用于管理虚拟桌面 (VDI)、应用和在线服务的领先平台
- 《不花钱学法语》--18个网站,强化法语六力
- QCustomplot(五)QCPAxisRect进行子绘图
- excel计算二元线性回归_用人话讲明白梯度下降Gradient Descent(以求解多元线性回归参数为例)...
- 计算机运维管理竞赛,设备管理维护技能竞赛试题.doc
- 2022年全国PMP考试地点汇总,你都知道吗?
- 判断输入是否为回车键
- PyG基于Node2Vec实现节点分类及其可视化