首页 > 其他分享 >14、 Django-多表操作-多个模块的关联-一对多的增删改查- models.ForeignKey()

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

时间:2024-07-09 22:30:12浏览次数:8  
标签:多表 14 ForeignKey models User user type id name

#多模块关联
    -- 关联分类: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为主键也是id
        User.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.CASCADE
    UserTyep.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 path

from app_mysql import views as one2many_view

urlpatterns = [

    #一对多
    #增加数据路由
    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),
]

 

标签:多表,14,ForeignKey,models,User,user,type,id,name
From: https://www.cnblogs.com/littlecc/p/18122583

相关文章

  • 洛谷P1014Cantor 表 C语言
    #include<stdio.h>intmain(){intinput;inth,k;inti,sum=0;scanf("%d",&input);for(i=1;;i++){sum+=i;//求出input数在那个范围内,i就是行数,sum就是所有行加起来数的个数if(sum>=input){h=......
  • NodeJS蔬菜自产零售混合销售平台-计算机毕业设计源码10149
    摘 要随着移动互联网的快速发展,购物方式也发生了巨大的变化。蔬菜作为消费者生活中必不可少的商品之一,在移动互联网时代也迎来了新的购物方式——购物小程序。购物小程序是一种基于手机应用平台的轻量级应用程序,用户可以通过它方便地浏览、选择和购买蔬菜。本文介绍了一个......
  • 竞速赛车游戏推荐:极品飞车14:热力追踪 (Win/Mac) 安装包
    《极品飞车14:热力追踪》(NeedforSpeed:HotPursuit)是《极品飞车》系列的第14部作品,于2010年11月发行。这款游戏是继《极品飞车:热力追踪2》后,系列再次回归该名称。游戏采用CriterionGames的开放世界设计,玩家可以在游戏中扮演警察或赛车手,进行追逐和逃避追逐的游戏体验。这......
  • 6. DQL-多表查询
        本小节主要讲解数据库的多表查询功能,可实现从多个表中查询数据,多表查询内容包括内连接,外连接,笛卡尔积,等值连接,非等值连接,SQL99标准链接语法以及联合查询。6.1.1多表查询的介绍从多个表中获取数据思考如下问题?写一条查询语句,查询员工姓名、部门名称、工作地点? ......
  • 14-45 剑和诗人19 - 一个负责任的 AI 成熟度 端到端 框架
    介绍人工智能有望改变企业和社会,但如果部署不当也会带来风险。最近围绕有偏见和不可靠的人工智能系统的争议表明,需要严格的治理来建立公众信任。这对于语言模型尤其重要——语言模型是在大量文本数据集上训练的高级人工智能模型,可以生成类似人类的写作。让我分享一个负责......
  • 14-48 剑和诗人22 - RAG 的主要痛点和解决方案
    ​​​​​检索增强生成(RAG)模型已成为一种有前途的方法,它利用存储在文档中的外部知识来提高生成文本的准确性和相关性。通过检索和调节相关的上下文文档,与传统语言模型相比,RAG模型可以产生更真实、更深入和更具体的响应。然而,与任何新技术一样,RAG模型也面临着一系列......
  • 【WCH蓝牙系列芯片】-CH9141模块AT指令增加自定义透传UUID服务
    -------------------------------------------------------------------------------------------------------------------------------------在使用沁恒的蓝牙串口透传芯片CH9141,这是一个自带固件,拿来接上串口就可以直接用的蓝牙模块芯片。支持串口AT配置和在从机模式下......
  • rfs (PID:146054): Database mount ID mismatch案例
    测试环境中,新搭建的Oracle19cDG,在主备切换后,新的主库的告警日志中一直出现类似下面这样的错误:.........................................2024-07-08T13:40:55.384302+08:00 rfs (PID:146054): Database mount ID mismatch [0x358d50ef:0x358e23cd] (898453743:8985077......
  • P2239 [NOIP2014 普及组] 螺旋矩阵
    洛谷题面:题目分析本题需要一个旋转的数字矩阵,因为填数要求,首先考虑DFS。注意写题目时,一定一定要注意数据范围!在此题中,注意数据范围对于 50%的数据,1⩽......
  • MVME147-012 处理器模块
    型号:MVME147-012配置:•25MHzMC68030微处理器•25MHzMC6888协处理器•8MBDRAM•(4)Bios芯片•以太网收发器接口•SCSI总线接口计算机被广泛应用于多个领域,包括但不限于:教育培训:在教育领域,单板计算机可以用于学生......