14、 Django-多表操作-多个模块的关联-一对多的增删改查- models.ForeignKey()

news/2025/1/22 15:53:41/文章来源:https://www.cnblogs.com/littlecc/p/18122583
#多模块关联-- 关联分类:Django中的三个函数-- ForeignKey-称为外键:一对多、将字段定义在多的一端中-- ManyToMnayField:多对多、将字段定义在两端的任意一端中-- OneToOneField:一对一、将字段定义在任意一端中

 

如:一对一:

一对多:

多对多:常用

 

如:

模型models.py

from django.db import models#1对多 1:N
#用户类型 :用户  -- 1:N
#一种用户类型:可以有多个用户
#一个用户:只属于一个用户类型#用户类型
class UserTyep(models.Model):name = models.CharField(max_length=30)#用户
class User(models.Model):name = models.CharField(max_length=30)age = models.IntegerField(default=10)#用户类型的对象user_type#使用外键ForeignKey关联两个表#定义外键 :外键写在多的一端 、这里关联用户类型#语法:关联的表名(模型类名) = models.ForeignKey(绑定的外键模型类, on_delete=models.CASCADE)#on_delete=models.CASCADE 级联删除:表示当用户类型中的某个字段删除后、是否也要将绑定在用户类型下的用户删除# user_type = models.ForeignKey(UserTyep, on_delete=models.CASCADE)   #级联模式#user_type = models.ForeignKey(UserTyep, on_delete=models.PROTECT)  # 保护模式# user_type = models.ForeignKey(UserTyep, on_delete=models.SET_NULL, null=True)  # 置空模式# user_type = models.ForeignKey(UserTyep, on_delete=models.SET_DEFAULT, default=0)  # 设置默认值# user_type = models.ForeignKey(UserTyep, on_delete=models.DO_NOTHING)  # 保护模式#设置related_name、设置了这个就不能使用自带的user_set属性了、直接使用 related_name='users' 中的users对象就行了user_type = models.ForeignKey(UserTyep, on_delete=models.PROTECT,related_name='users')#no_delete有以下的选项:
#   1、models.CASCADE    表示级联删除、即当删除UserType表的主键数据时、相关联的表User中的对应的外键的数据也会被删除
#   2、models.PROTECT    表示保护模式、阻止级联删除
#   3、models.SET_NULL   置空模式、设为null、相应的null=True(必须)、意思是当删除UserType表的主键数据时、相关联的表User中的对应的外键的数据不会被删除、外键变为null
#   4、models.SET_DEFAULT    #设置默认值、表示删除关联的外键值后相应的数据不会删除、但是要指定默认的外键值
#   5、models.SET()      删除的时候重新动态指向一个实体访问对应元素、可传函数、不常用、类似SET_DEFAULT
#   6、models.DO_NOTHING 什么也不做、外键不会消失也不会改变   不建议使用#数据迁移#python .\manage.py makemigrations#python .\manage.py migrate#数据迁移后会在定义外键的表(字段多)自动新增一个字段:字段命名为:被绑定的外键类名小写(user_type)_主键名(id)

 

#增加数据

views.py

from django.shortcuts import render,HttpResponse
from app_mysql.models import *#一对多的增删改查#增
def add_user(request):# #给UserTyPe表添加数据# user_types = ['温工', '黄工', '番薯', '柱子']# for name in user_types:#     UserTyep.objects.create(name=name)#给User表添加数据for i in range(11, 30):# #使用用户类型的id(user_type_id-主键)绑定用户# User.objects.create(name=f'张三-{i}', age=i, user_type_id=i%4 + 1)#使用用户类型的对象绑定用户#user_type=UserTyep.objects.get(pk=i%4 + 1) 获取的是用户类型的id:pk为主键也是idUser.objects.create(name=f'李四-{i}', age=100+i,user_type=UserTyep.objects.get(pk=i%4 + 1))return HttpResponse('添加成功')#删除数据
def del_user(request):# #删除User数据、对用户类型无影响# User.objects.filter(id=6).delete()#删除UserType中的数据、会影响User表中的数据#这里删除用户类型表中id=2的类型、会导致用户表中(外键)user_type_id=2的用户也会被删除、这就是级联删除on_delete=models.CASCADEUserTyep.objects.filter(id=2).delete()return HttpResponse('删除成功')#修改数据
def update_user(request):#修改UserType表数据UserTyep.objects.filter(id=3).update(name='小新')#修改User表数据User.objects.filter(id=11).update(age=20)return HttpResponse('修改成功')#查询数据
def get_user(request):# #正向查询:从User表去查找UserType表数据# user = User.objects.get(id=2)# #user.user_type 拿到的是用户类型的对象# print(user.name, user.age, user.user_type, user.user_type_id)# print(user.user_type.name, user.user_type.id)#反向查询:从UserType表去查对应的用户# utype = UserTyep.objects.get(pk=1)# print(utype.id, utype.name) #UserType自身的属性# # user_set:内部自动会生成的属性、可以让你反向查询到所关联的所有的User用户表的集合# #print(utype.user_set)# print(utype.user_set.all())     #返回查询集列表#使用filter查找#通过UserType中指定的字段查找User表中相关联的用户#如查找用户类型表中id=3 name='番薯' 所关联的用户# users = User.objects.filter(user_type=UserTyep.objects.get(name='番薯'))  #传入UserType的对象# users = User.objects.filter(user_type_id=3) #通过字段查找# users = User.objects.filter(user_type__name='番薯')   #传入UserType表中的字段#还可以使用 related_name查找、当使用了related_name就不能使用自带的_set相关的属性了、如utype.user_set.all()#需要在models中设置utype = UserTyep.objects.get(pk=1)print(utype.users.all())print(utype.users.filter())return HttpResponse('查询成功')

 

urls.py


from django.contrib import admin
from django.urls import pathfrom app_mysql import views as one2many_viewurlpatterns = [#一对多#增加数据路由path('one2many/adduser/', one2many_view.add_user),#删除数据路由path('one2many/deluser/', one2many_view.del_user),#修改数据path('one2many/updateuser/', one2many_view.update_user),#查询数据path('one2many/getuser/', one2many_view.get_user),path('admin/', admin.site.urls),
]

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741365.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文熟悉拖拽式表单设计器的方方面面

通过本文,可以详细了解拖拽式表单设计器的更多优势和特点。很多客户朋友都想知道用什么样的软件平台可以实现提质、降本、增效的目的。可以来了解低代码技术平台、拖拽式表单设计器的更多功能与特点。作为专业的服务商,流辰信息为客户提供整套低代码技术平台服务解决方案,通…

Simple WPF: C# 使用基本的async/await实现异步

本文介绍了基本async/await关键字基于TAP任务异步模型的异步任务处理方法。最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。 创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧! 博主开始学习编程于11年前,年少时还只会使用cin 和cout ,给单片…

植物大战僵尸1.2.0.1073汉化版

下载链接:https://download.csdn.net/download/hello_hlqk/89528378?spm=1001.2101.3001.9499 植物大战僵尸是一款益智策略类塔防游戏,玩家通过武装多种植物切换不同的功能,快速有效地把僵尸阻挡在入侵的道路上。不同的敌人,不同的玩法构成五种不同的游戏模式,加之黑夜、…

3-电子支付技术与系统

3.1 电子货币及其职能 3.1.1 电子货币的定义 在电子商务迅速发展和金融电子化的背景下,电子货币成为媒介商品交易的重要工具。电子货币(ElectronicMoney,)是指用一定金额的现金或存款从发行者处兑换并获得代表相同金额的数据或者通过银行及第三方推出的快捷支付服务,通过使…

先有鸡还是先有蛋?这是领域驱动设计落地最大的困局

本文书接上回 《关于领域驱动设计,大家都理解错了》 欢迎关注公众号“老肖想当外语大佬”: https://mp.weixin.qq.com/s/HHJ5vt2_iT0-CFcw0HcPnA 先有鸡还是先有蛋的困局 前文我们提出了“领域驱动设计是一种价值观”这个观点,那么落地领域驱动设计就是践行价值观的过程,实…

2017年,我成为了技术博主

2017年9月,我已经大三了。 >>上一篇(爪哇,我初窥门径) 我大二学了很多java技术,看似我一会就把javaweb/ssh/ssm这些技术栈给学了。 这些技术确实不难,即便是我,我都能学会,门槛并不高。 但是,这也不是能随便百度学学,10分钟就懂了,学会了。 从理解技术的用途,…

一起了解自定义流程表单开发的主要优势

低代码技术平台、自定义流程表单开发的主要优势特点表现在哪来?当前,想要进行流程化办公,应用专业的软件平台产品是非常重要的。低代码技术平台拥有可视化操作界面、很灵活、易维护等优势特点,可以应用于很多中小型流程化办公中。那么,低代码技术平台、自定义流程表单开发…

[NodeJS] JavaScript模块化

这篇文章介绍了JavaScript模块化的发展历程及各种方案,包括IIFE、CommonJS、AMD、CMD、UMD及ESM。对比了各方案的特点和优缺点。同时,深入剖析了Node.js中CommonJS的模块加载机制。JavaScript诞生于1995年,一开始只是用于编写简单的脚本。 随着前端开发任务越来越复杂,Java…

论文阅读: 面向Planning的端到端智驾Planning-oriented Autonomous Driving

设计一个更优的、可理解的、面向最终目标的框架。基于这个面向Planning的思想,他们提出了 Unified Autonomous Driving (UniAD)方案,一种新的自动驾驶框架。这个方案从全局视角出发,让智驾的各个模块特征提取可以互相补充,各个任务之间可以通过统一的查询接口通信。在此基础…

基于FileZilla上传、下载服务器数据的方法

本文介绍FileZilla软件的下载、配置与使用方法~本文介绍FileZilla软件的下载、配置与使用方法。在之前的博客中,我们提到了下载高分遥感影像数据需要用到FTP(文件传输协议,File Transfer Protocol)软件FileZilla;这一软件用以在自己的电脑与服务器之间相互传输数据,在进行…

text1

sad das dasdasdgrdgt是g天热共同的sgtd发广泛的撒旦撒撒大大大叔

TextCNN: Convolutional Neural Networks for Sentence Classification

本文是CNN应用在NLP领域的开山之作。TextCNN的成功并不是网络结构的成功,而是通过引入已经训练好的词向量在多个数据集上达到了超越benchmark的表现,证明了构造更好的embedding,是提升NLP各项任务的关键能力。作者做了一系列实验,这些实验使用卷积神经网络(CNN)在预训练的…