草庐IT

django--ORM表的多对一关系

016681gzz 2023-04-15 原文
  • 多对一关系是什么

Django使用django.db.models.ForeignKey定义多对一关系。

ForeignKey需要一个位置参数:与该模型关联的类

 class Info(models.Model):
       user = models.ForeignKey(other_model,on_delete=models.SET_NULL)

生活中的多对一关系:班主任,班级关系。一个班主任可以带很多班级,但是每个班级只能有一个班主任

 from django.db import models
 # id name gender 定义老师的模型类
 class Teacher(models.Model):
     name = models.CharField(max_length=30,verbose_name="老师姓名")
     gender = models.CharField(max_length=10,verbose_name="老师性别")
     class Meta:
         db_table = "teachers"
     def __str__(self):
         return self.name
 # id name gender score teacher_id
 class Student(models.Model):
     name = models.CharField(max_length=20,verbose_name="学生姓名")
     gender = models.CharField(max_length=10,verbose_name="学生性别")
     score = models.IntegerField(verbose_name="学生分数")
     # to:后边写所关联的模型类  
     # on_delete=models.CASCADE:主表中数据删除,从表也删除
     # 外键关联的是整个模型类,不是单独的某一个对象
     # 但是通过模型类会产生一个相关联的字段 字段名_id
     teacher = models.ForeignKey(to=Teacher,on_delete=models.CASCADE,verbose_name="所属老师")
     class Meta:
         db_table = "students"
     def __str__(self):
         return self.name
  • 多对一关系的增删改操作

 添加老师语法:
  模型类.objects.create()
     Teacher.objects.create(name="王老师",gender="女")
 删除老师语法:
  模型类.objects.get(条件).delete()
  # 删除id为2的老师
  Teacher.objects.get(id=2).delete()  # (3, {'myapp.Student': 2, 'myapp.Teacher': 1})
   # 3代表一共删除的数据个数 Student删除3条 Teacher删除1
 修改老师语法:
     模型类.objects.filter(条件).update()
  # 修改id为3的老师性别为女
  Teacher.objects.filter(id=3).update(gender="女")

以上创建了两条老师数据 由于我们设置外键关联可以为空null=True,所以此时在班级表创建时,可以直接保存,不需要提供老师数据

 添加学生语法:
     模型类.objects.create()
  通过外键_id的形式来添加
  Student.objects.create(name="李四",gender="男",score=80,teacher_id=3)
  直接给外键赋值一个老师对象
  t1 = Teacher.objects.create(name="李老师",gender="男")
  Student.objects.create(name="李四",gender="男",score=80,teacher=t1)
 删除学生语法:
  模型类.objects.get(条件).delete()
     Student.objects.get(id=1).delete()
 修改学生语法:
     模型类.objects.filter(条件).update(字段1,字段2...)
     Student.objects.get(id=1).update(name="张三")

注意要记得删除之后要重新获取一次数据,否则查看到的结果中还是之前获取到的有老师的班级数据

  • 多对一的正向查询

将老师分配个班级之后,由于班级表关联了老师字段,我们可以通过班级找到对应老师 虽然老师表中没有关联班级字段,

但是也可以通过老师找到他所带的班级,这种查询方式也叫作关联查询

 # 查询id为2的学生的老师姓名
  --找到id为2的学生
     stu = Student.objects.get(id=2)
     --找到stu对应的老师    stu.teacher.name
     stu.外键.name
  • 多对一的反向查询

通过模型类名称后追加一个_set,来实现反向查询

 反向查询:通过django的内置属性来进行查询  模型类(模型类小写)_set()可以反向查询老师名下的所有学生,
     # 查询id为1的老师的所有学生   --先找到id为1的老师    
     tea = Teacher.objects.get(id=1)    
     --查询tea老师名下的所有学生  老师对象.模型类_set.all()    
     tea.student_set.all()

有关django--ORM表的多对一关系的更多相关文章

  1. ruby - 在一个进程多个数据库连接 sinatra 应用程序中使用什么 ORM? - 2

    已检查ActiveRecord、DataMapper、Sequel:有些使用全局变量(静态变量)有些需要在使用模型加载源文件之前打开数据库连接。在使用不同数据库的sinatra应用程序中使用哪种ORM更好。 最佳答案 DataMapper专为多数据库使用而设计。你可以通过像DataMapper.setup(:repository_one,"mysql://localhost/my_db_name")这样的方式设置多个存储库。DataMapper随后会跟踪所有已在哈希中设置的存储库,您可以引用该哈希并将其用于范围界定:DataMapp

  2. ruby-on-rails - 如何添加具有额外列的多对多记录 - 2

    我有以下模型用户has_many:users_contactshas_many:contacts,through::users_contactsaccepts_nested_attributes_for:contacts,allow_destroy:true联系方式has_many:users_contactshas_many:users,through::users_contactsaccepts_nested_attributes_for:users_contacts,allow_destroy:true用户联系belongs_to:usersbelongs_to:contacts

  3. ruby-on-rails - 带图片 uploader 的多步表单 - 2

    我想建立3步用户注册,在第2步上传头像。所以我遵循RyanBates的指南http://railscasts.com/episodes/217-multistep-forms.我正在使用CarrierWavegem来处理上传。但似乎我无法在用户session中存储上传的文件信息(我收到无法转储文件错误)。我在Controller中使用以下技术ifparams[:user][:img_path]@uploader=FirmImgUploader.new@uploader.store!(params[:user][:img_path])session[:img]=@uploaderpara

  4. ruby - 点列表的 RGeo 凸包 - 2

    RGeo有可用的凸包方法,但在这方面根本没有文档。给定一组点,我如何找到它们的凸包? 最佳答案 好问题。事实证明,有一种名为“MultiPoint”的几何类型适用于此。我做了一个简单的例子来测试它,它似乎运行良好。f=RGeo::Geos.factory(:srid=>3361,:buffer_resolution=>8)#mytypicallocalrectilinearprojectionfactorywithmydefaultsettings.coords=[[1,1],[2,2],[1,3]]points=[]coords.

  5. ruby-on-rails - 在 Ruby on Rails 中验证 Django 密码给出不匹配的密码 - 2

    我正在用RubyonRails重写Django应用程序,并希望为用户保留旧密码。Django使用PBKDF2SHA1作为加密机制。所以我有一个加密密码是这个pbkdf2_sha256$10000$YsnGfP4rZ1IZ$Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBPUgmunFOW4=原密码是2bulls在Ruby中,我使用PBKDF256gem和base64进行检查。Base64.encode64PBKDF256.dk("2bulls","YsnGfP4rZ1IZ",10000,32)我很期待Tpf4922MoNEjuJQA9EG2Elptyt3dMAyzBP

  6. ruby - 一个哈希中的多个子哈希 - 2

    我有一个散列:hash={"a_1_a"=>"1","a_1_b"=>"2","a_1_c"=>"3","a_2_a"=>"3","a_2_b"=>"4","a_2_c"=>"4"}获取以下子哈希的最佳方法是什么:[{"a_1_a"=>"1","a_1_b"=>"2","a_1_c"=>"3"},{"a_2_a"=>"3","a_2_b"=>"4","a_2_c"=>"4"}]我希望它们根据正则表达式/^a_(\d+)/按键分组。我将在原始哈希中包含50多个键/值对,因此如果有人有任何建议,动态的东西会最好。 最佳答案 如果您只关心

  7. ruby - 如何在 Sequel ORM 中将行作为数组(而不是哈希)获取? - 2

    在SequelRuby的ORM,Dataset类有一个all方法,它生成一个行散列数组:每一行都是一个以列名作为键的散列。例如,给定一个表T:abc--------------022"Abe"135"Betty"258"Chris"然后:ds=DB['selecta,b,cfromT']ah=ds.all#ArrayofrowHashes应该产生:[{"a":0,"b":22,"c":"Abe"},{"a":1,"b":35,"c":"Betty"},{"a":2,"b":58,"c":"Chris"}]Sequel中是否有一种方法可以代替生成行数组的数组,其中每一行都是一个仅包含每一

  8. ruby - memcached 是否有类似 ORM 的包装器 - 2

    我正在寻找一个ruby​​gem(或rails插件),它以与ActiveRecord抽象SQL细节相同的方式抽象出memcached的细节。我不是正在寻找有助于在memcached中缓存ActiveRecord模型的东西。我确信大约有4215个gem可以帮助解决这个问题。理想情况下,我希望能够执行以下操作:classApple然后能够做类似的事情:my_apple=Apple.find('somememcachedkey')这将在memcached中查找此类的JSON表示并将其反序列化。我也许还能做类似的事情:my_apple.color="red"#persistchangesbac

  9. 基于python的短视频智能推荐/django的影视网站/视频推荐系统 - 2

    摘要本论文主要论述了如何使用Python技术开发一个短视频智能推荐,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述短视频智能推荐的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 短视频智能推荐的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、热门视频管理、用户上传管理、系统管理,用户:首页、个人中心、用户上传管理、我的收藏管理,前台首页;首页、热门视频、用户上传、公告信息、个人中心、后台管理等功能。由于本网站的功能模块设计比较全面,所以使得整个短视频智能推荐信

  10. ruby - Datamapper 中多对多关系的战略性预加载? - 2

    我正在使用DataMapper,一个用于ruby​​的开源ORM,我很想抓挠。目前,DataMapper可以对一对多关系使用StrategicEagerLoading(SEL),但不能对发生N+1查询的多对多关系使用。我想设法让这项工作正常进行,但我找不到在哪里做。所以两部分问题:如何运行测试套件,以便它显示失败(注意,现在所有应该失败的规范都标记为待定)?在何处以及如何为一对多关系实现SEL? 最佳答案 对于第二个问题,您可以尝试深入研究代码:/lib/dm-core/associations/relationship.rb#Ea

随机推荐