1.最简单的跨表,查询外键表中符合主表条件的记录列表

  1. #用户类型表
  2. class User_typ(models.Model):
  3. name=models.CharField(max_length=32)
  4.  
  5. #用户表
  6. class User(models.Model):
  7. name=models.CharField(max_length=32)
  8. age=models.IntegerField(max(100))
  9. type=models.ForeignKey(User_typ)
  10.  
  11. #查询用户表里所有记录(对象列表)
  12. obj_list=User.objects.all()
  13.  
  14. #查询用户表里某一列字段的所有记录(对象列表)
  15. obj_field_list=User.objects.all().values('name')
  16.  
  17. #跨表
  18. #查询用户表中,用户类型为 普通用户(用户类型表中有一条记录为‘普通用户’) 的所有记录(对象列表)
  19. obj=User.objects.filter(type__name='普通用户')

2.最简单的多表联查,查询外键表中符合主表的主表的条件的记录列表

  1. #主表aa
  2. class aa(models.Model):
  3. a=models.CharField(max_length=32)
  4.  
  5. #外键表bb,同时也是cc的主表
  6. class bb(models.Model):
  7. b=models.CharField(max_length=32)
  8. b1=models.ForeignKey(User_typ)
  9.  
  10. #外键表cc
  11. class cc(models.Model):
  12. c=models.CharField(max_length=32)
  13. c1=models.ForeignKey(User_typ)
  14.  
  15. #cc表中符合aa表中a==‘xx’的记录列表
  16. obj_list=cc.objects.filter(c1__b1__a='xx')

3.书、出版社、作者,三者之间互相查来查去

1.建立这四个表

  1. #一对一 OneToOne(表名)
  2. #一对多 ForeignKey(表名)
  3. #多对多 ManyToMany(表名)
  4.  
  5. #建立书表
  6. class Book(models.Model):
  7. title = models.CharField(max_length=32)
  8. publishDdata = models.DateField() # 出版日期
  9. price = models.DecimalField(max_digits=5, decimal_places=2) # 一共5位,保留两位小数
  10. publish = models.ForeignKey("Publish") #foreignkey(表名)建立的一对多关系
  11. authorlist = models.ManyToManyField("Author") #建立的多对多的关系
  12. def __str__(self): #__str__方法使用来吧对象转换成字符串的,你返回啥内容就打印啥
  13. return self.title
  14.  
  15. #建立出版社表
  16. class Publish(models.Model):
  17. name =models.CharField(max_length=32)
  18. addr = models.CharField(max_length=32)
  19.  
  20. def __str__(self):
  21. return self.name
  22.  
  23. #建立作者表
  24. class Author(models.Model):
  25. name = models.CharField(max_length=32)
  26. age = models.IntegerField()
  27.  
  28. #建立作者详细信息表
  29. class AuthorDeital(models.Model):
  30. tel = models.IntegerField()
  31. addr = models.CharField(max_length=32)
  32. author = models.OneToOneField("Author") #建立的一对一的关系

2.orm字段必须要知道的一些属性

  1. (0)null
  2.  
  3. 如果为TrueDjango 将用NULL 来在数据库中存储空值。 默认值是 False.
  4.  
  5. (1)blank
  6.  
  7. 如果为True,该字段允许不填。默认为False
  8. 要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
  9. 如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。
  10.  
  11. (2)default
  12.  
  13. 字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。
  14.  
  15. (3)primary_key
  16.  
  17. 如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True
  18. Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
  19. 否则没必要设置任何一个字段的primary_key=True
  20.  
  21. (4)unique
  22.  
  23. 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的
  24.  
  25. (5)choices
  26. 由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices
  27. 默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。
  28.  
  29. 这是一个关于 choices 列表的例子:
  30.  
  31. YEAR_IN_SCHOOL_CHOICES = (
  32. (‘FR‘, Freshman‘),
  33. (‘SO‘, Sophomore‘),
  34. (‘JR‘, Junior‘),
  35. (‘SR‘, Senior‘),
  36. (‘GR‘, Graduate‘),
  37. )
  38. 每个元组中的第一个元素,是存储在数据库中的值;第二个元素是在管理界面或 ModelChoiceField 中用作显示的内容。
  39. 在一个给定的 model 类的实例中,想得到某个 choices 字段的显示值,就调用 get_FOO_display 方法(这里的 FOO 就是 choices 字段的名称 )。例如:
  40.  
  41. from django.db import models
  42.  
  43. class Person(models.Model):
  44. SHIRT_SIZES = (
  45. (‘S‘, Small‘),
  46. (‘M‘, Medium‘),
  47. (‘L‘, Large‘),
  48. )
  49. name = models.CharField(max_length=60)
  50. shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
  51.  
  52. >>> p = Person(name="Fred Flintstone", shirt_size="L")
  53. >>> p.save()
  54. >>> p.shirt_size
  55. L
  56. >>> p.get_shirt_size_display()
  57. Large

3.orm添加记录,其实重要的是先查到,然后再添加就比较容易了,传说中的三种方式,貌似实际应用中只有save()的方式可以使用,原因无他,只有save()能触发django定义的一些钩子函数,留下数据更改的日志信息,比较安全。

4.跨表查询一览图

  1. #一对一查询
  2.  
  3. # 正向查询:手机号为13245的作者的姓名
  4. deital_obj = models.AuthorDeital.objects.filter(tel="").first()
  5.  
  6. print(deital_obj.author.name)
  7.  
  8. # 反向查询:查询作者韩寒的手机号
  9. author_obj = models.Author.objects.filter(name="韩寒").first()
  10.  
  11. print(author_obj.authordeital.tel)
  12.  
  13. #可以看出来,一对一就如同将两个表何为一个表,然后一个表起两个名字似的
  14.  
  15. #一对多查询
  16.  
  17. # 正向查询:查询《金鳞岂是池中物》的出版社的地址
  18.  
  19. # 找到《金鳞岂是池中物》那一条记录对象
  20. book_obj = models.Book.objects.filter(title="金鳞岂是池中物")[0]
  21.  
  22. print(book_obj.publish) # 拿到的是关联出版社的对象
  23. print(book_obj.publish.addr) #出版《金鳞岂是池中物》的那家出版社的地址
  24.  
  25. # 反向查询:查询人民出版社出版过的所有的书的名字
  26.  
  27. #找到叫‘人民出版社’的出版社记录(对象)
  28. pub_obj = models.Publish.objects.filter(name="人民出版社")[0]
  29. # 叫‘人民出版社出版’的出版社 出版的所有书的对象集合
  30. book_list=publish.book_set.all()
  31. #用for循环遍历查询出每本书的名字
  32. for book_obj in book_list:
  33. print(book_obj.title)
  34.  
  35. #多对多查询记录
  36.  
  37. # 正向查询:查询《金鳞岂是池中物》这本书的所有的作者的姓名和年龄
  38. book_obj = models.Book.objects.filter(title="金鳞岂是池中物")[0] #找到书的记录(对象)
  39. print(book_obj.authorlist.all().values("name", "age")) # 这本书关联的所有作者对象的集合,注意这里又表现出了一对一的本质是二表合一的特性
  40.  
  41. # 反向查询:查询作者‘兰陵笑笑生’ 出了哪几本书
  42. lan_obj = models.Author.objects.filter(name="兰陵笑笑生")[0]#找到作者的记录(对象)
  43. print(lan_obj.book_set.all()) # 与该作者关联的所有书对象的集合

django orm 重点大全的更多相关文章

  1. Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点)

    Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点) 一丶Django的静态文件配置 #we ...

  2. Django ORM 查询管理器

    Django ORM 查询管理器 ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言 ...

  3. Django ORM模型

    Object Relational Mapping(ORM) 一,ORM介绍 1, ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象 ...

  4. Django ORM那些相关操作zi

    Django ORM那些相关操作   一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...

  5. Django学习笔记之Django ORM相关操作

    一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...

  6. Django ORM哪些操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

  7. python 终级篇 django ---ORM操作

                                       一般操作                                                          必会的 ...

  8. Django ORM操作及进阶

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

  9. Django ORM相关的一些操作

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

随机推荐

  1. admin快速搭建后台管理系统

    一.基于admin后台管理系统的特点: 权限管理:权限管理是后台管理系统必不可少的部分,拥有权限管理,可以赋予用户增删改查表权限(可以分别赋予用户对不同的表有不同的操作权限): 前端样式少:后台管理主 ...

  2. centOS 开机自启动自己的脚本

    centOS 开机自启动自己的脚本 1. 自己脚本 myservice 如下: #!/bin/bash # chkconfig: # description: myservice .... echo ...

  3. Unable to resolve target 'android-15'

    SDK 15没有加载造成的,在SDK Manager.exe下安装以下文件 Android SDK Tools (25.2.5) Android SDK Platform-tools (28.0.1) ...

  4. react 自我小计

    1.react中的方法调用,在onClick事件中不需要加小括号. <button onClick={this.show}>方法的调用</button> show(){ con ...

  5. 【RNN】资源汇总

    wesome Recurrent Neural Networks A curated list of resources dedicated to recurrent neural networks ...

  6. java读取excel获取数据写入到另外一个excel

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  7. controller修改response返回值

    1.responseBodyAdvice2. aop3.过滤器.拦截器

  8. Windows服务一直“正在启动”怎么杀

    转载:https://blog.csdn.net/huanglong8/article/details/71156848 PS:cmd 记得使用 管理员身份运行 这里需要通过控制台 命令行来查询PID ...

  9. Android 右上角菜单栏

    1 创建菜单栏 在res下新建menu文件夹,并且创建righttopmenu.xml righttopmenu.xml: <?xml version="1.0" encod ...

  10. 洛谷P1074 靶形数独(算竞进阶习题)

    还是数独.. 比上一个多了个分数矩阵,其实没什么差别,但是数据好像水了许多... #include <bits/stdc++.h> #define INF 0x3f3f3f3f using ...