首页 > 其他分享 >Django ORM模型一对一、一对多、多对多操作

Django ORM模型一对一、一对多、多对多操作

时间:2023-08-17 11:55:48浏览次数:36  
标签:__ Class objects 一对一 Django filter models ORM id

创建模型

from django.db import models
 
#学生类
class  Student(models.Model):
    id = models.AutoField(primary_key=True)
    sname = models.CharField(max_length=20)
 
    # 一对多外键设置,'多'的模型类设置外键,注意需要带参数on_delete
    cid = models.ForeignKey('Class',on_delete=models.CASCADE)
 
    # 一对一外键设置,哪个模型设置外键都可以,注意需要带参数on_delete
    detail = models.OneToOneField('StudentDetail',on_delete=models.CASCADE)
 
#学生信息类
class StudentDetail(models.Model):
    id = models.AutoField(primary_key=True)
    height = models.IntegerField()
    email = models.EmailField()
    memo = models.TextField(max_length=100)
 
#班级类
class Class(models.Model):
    id = models.AutoField(primary_key=True)
    cname = models.CharField(max_length=20)
    cdata = models.DateField()
 
#老师类
class Teacher(models.Model):
    id = models.AutoField(primary_key=True)
    tname = models.CharField(max_length=20)
 
    #多对多外键设置,哪个模型类创建外键都可以,注意没有on_delete参数
    cid = models.ManyToManyField(Class)

  

在mysql数据库中生成对应表格

#创建迁移文件
python manage.py makemigrations        

#应用迁移文件
python manage.py migrate

  

操作

一对一

Student ---> StudentDetail
#正向
Student.objects.filter(id__gt=2)[0].detail
StudentDetail.objects.filter(student__id__gt=1)

#反向
StudentDetail.objects.get(id=1).student
Student.objects.filter(detail__id__exact=1)

 

一对多   

Student ---> Class
add(obj1, obj2, ...)添加一指定的模型对象到关联的对象集中
create(**kwargs)创建一个新的对象,将它保存并放在关联的对象集中。返回新创建的对象
remove(obj1, obj2, ...)从关联的对象集中删除指定的模型对象
clear()从关联的对象集中删除所有的对象。

Student ---> Class
s1=Student(**data)
s1.save()
c1 =Class(**data1)
c1.save()
c1.student_set.add(s1)
c1.student_set.create(**data)

a1 = Student.objects.filter(id=1)
c1.student_set.remove(a1)
c1.article_set.clear()


#正向
  Student.objects.get(id=1).cid      
  Class.objects.filter(student__id=1)  

 #反向
    Class.objects.get(id=1).student_set.all()   #副表调用主表信息,使用   主表名(全小写)__set 
    Student.objects.filter(cid__id=1)  

 多对多 

Teacher --> Class
# 正向
Teacher.objects.get(id=1).cid.all()
Class.objects.filter(teacher__id=1)

# 添加
Teacher.objects.get(id=5).cid.add(*Class.objects.filter(id__gt = 3))
#移除
Teacher.objects.get(id=5).cid.remove(*Class.objects.filter(id__gt=1))
#清空对象关系
Teacher.objects.get(id=5).cid.clear()
#重新设置关系     #添加新关系,删除多余关系
Teacher.objects.get(id=5).cid.set(list(Class.objects.filter(id__gt=5)) )#参数为一个可迭代对象就可以

#反向
Class.objects.get(id=1).teacher_set.all()
Teacher.objects.filter(Q(cid__id=1) | ~Q(cid__id=2))

  

 

标签:__,Class,objects,一对一,Django,filter,models,ORM,id
From: https://www.cnblogs.com/boye169/p/17637228.html

相关文章

  • formDataToJSON 抽丝剥茧 formData 与 Object 的转换【玩转源码】
    前言通过axios源码阅读,实现formDataToJSON抽丝剥茧formData与Object的转换,接下来详细分享整个过程。formDataToJSON抽丝剥茧formData与Object的转换FormData对象FormData对象用以将数据编译成键值对,以便用XMLHttpRequest来发送数据。FormData对象主要用于发送表单数......
  • mormot2 笔记(二) Http服务的简单搭建
    mormot2框架中有个THttpServer类,它有一个Router属性,定义如下:propertyRouter:TUriRouterreadfRoute;Router是添加路由的入口点,它有和http协议对应的get,post,put,delete等方法,这些方法可以添加路由,下面常用的get方法定义。procedureGet(constaUri:RawUtf8;......
  • DevExpress WinForms数据编辑器组件,提供丰富的数据输入样式!(一)
    DevExpressWinForms超过80个高影响力的WinForms编辑器和多用途控件,从屏蔽数据输入和内置数据验证到HTML格式化,DevExpress数据编辑库提供了无与伦比的数据编辑选项,包括用于独立数据编辑或用于容器控件(如Grid,TreeList和Ribbon)的单元格。PS:DevExpressWinForm拥有180+组件和UI......
  • 解密Prompt系列13. LLM Agent-指令微调方案: Toolformer & Gorilla
    上一章我们介绍了基于Prompt范式的工具调用方案,这一章介绍基于模型微调,支持任意多工具组合调用,复杂调用的方案。多工具调用核心需要解决3个问题,在哪个位置进行工具调用(where),从众多工具中选择哪一个(Which),工具的输入是什么(What)。Where+Which+What,我称之为3W原则,3H它兄......
  • 关于使用Terraform为Azure创建一个资源组的简单案例
    使用Terraform创建AzureCloud平台的资源需要,得还有如下主要的环境及条件a、安装有Terraformb、解决身份认证及相关的权限++++++++++++++++++++++++++++++++++++++++++++++本文的目标,创建一个rg-开着的随机名称的资源组先得准备有4个文件,【providers.tf】、【main.tf】、【v......
  • 数据库表关系(一对一,一对多,多对多)
    一、1、一对一:         一个人只能有一个身份证号,不能有多个,是唯一的IdNameCard1张三140702**********012李四140702**********79 2、一对多:     一个年级可以有多个班级,多个班级都属于一个阶段 一个班可以有......
  • winform编译时怎么把指定dll拷贝到debug里面(非引用)
    选中winform项目-》右键属性-》选择生成事件-》在生成后事件命令行配置以下代码Copy"$(ProjectDir)dll\*.*""$(ProjectDir)$(OutDir)" ......
  • Winform控件自适应窗体大小
    思路[参考他人]:1>保存窗体的初始宽度和高度;2>保存窗体内所有控件的初始宽度,初始高度和坐标;3>窗体的Resize事件触发时,计算新的Size和初始Size的比例prec;4>遍历窗体内所有控件,将其的Size和坐标乘以prec;代码:窗体注册,保存窗体及其所有控件的初始尺寸,编写Resize事件逻辑:public......
  • Distributions: Uniform | Cauchy |
    UniformDistribution:U(a,b):F(x)=x·1/(b-a)p(x)=1/(b-a)ifq<x<b;p(x)=0else.E(x)=(a+b)/2CauchyDistribution:F(x)=[arctan(x)+pi/2]·1/pip(x)=[1/(1+x^2)]·1/piE(x):non-exist......
  • 【Django】paginator分页操作
    fromdjango.core.paginatorimportPaginator,EmptyPage,PageNotAnIntegerdefmain(object_list,page_index,display_num=10):""":paramobject_list::parampage_index::paramdisplay_num::return:分页后数据列表分页后总页数当前页码每......