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

#用户类型表
class User_typ(models.Model):
name=models.CharField(max_length=32) #用户表
class User(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField(max(100))
type=models.ForeignKey(User_typ) #查询用户表里所有记录(对象列表)
obj_list=User.objects.all() #查询用户表里某一列字段的所有记录(对象列表)
obj_field_list=User.objects.all().values('name') #跨表
#查询用户表中,用户类型为 普通用户(用户类型表中有一条记录为‘普通用户’) 的所有记录(对象列表)
obj=User.objects.filter(type__name='普通用户')

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

#主表aa
class aa(models.Model):
a=models.CharField(max_length=32) #外键表bb,同时也是cc的主表
class bb(models.Model):
b=models.CharField(max_length=32)
b1=models.ForeignKey(User_typ) #外键表cc
class cc(models.Model):
c=models.CharField(max_length=32)
c1=models.ForeignKey(User_typ) #cc表中符合aa表中a==‘xx’的记录列表
obj_list=cc.objects.filter(c1__b1__a='xx')

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

1.建立这四个表

#一对一    OneToOne(表名)
#一对多 ForeignKey(表名)
#多对多 ManyToMany(表名) #建立书表
class Book(models.Model):
title = models.CharField(max_length=32)
publishDdata = models.DateField() # 出版日期
price = models.DecimalField(max_digits=5, decimal_places=2) # 一共5位,保留两位小数
publish = models.ForeignKey("Publish") #foreignkey(表名)建立的一对多关系
authorlist = models.ManyToManyField("Author") #建立的多对多的关系
def __str__(self): #__str__方法使用来吧对象转换成字符串的,你返回啥内容就打印啥
return self.title #建立出版社表
class Publish(models.Model):
name =models.CharField(max_length=32)
addr = models.CharField(max_length=32) def __str__(self):
return self.name #建立作者表
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField() #建立作者详细信息表
class AuthorDeital(models.Model):
tel = models.IntegerField()
addr = models.CharField(max_length=32)
author = models.OneToOneField("Author") #建立的一对一的关系

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

(0)null

如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.

(1)blank

如果为True,该字段允许不填。默认为False。
要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。 (2)default 字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。 (3)primary_key 如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True,
Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
否则没必要设置任何一个字段的primary_key=True。 (4)unique 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的 (5)choices
由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,
默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。 这是一个关于 choices 列表的例子: YEAR_IN_SCHOOL_CHOICES = (
(‘FR‘, ‘Freshman‘),
(‘SO‘, ‘Sophomore‘),
(‘JR‘, ‘Junior‘),
(‘SR‘, ‘Senior‘),
(‘GR‘, ‘Graduate‘),
)
每个元组中的第一个元素,是存储在数据库中的值;第二个元素是在管理界面或 ModelChoiceField 中用作显示的内容。
在一个给定的 model 类的实例中,想得到某个 choices 字段的显示值,就调用 get_FOO_display 方法(这里的 FOO 就是 choices 字段的名称 )。例如: from django.db import models class Person(models.Model):
SHIRT_SIZES = (
(‘S‘, ‘Small‘),
(‘M‘, ‘Medium‘),
(‘L‘, ‘Large‘),
)
name = models.CharField(max_length=60)
shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES) >>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
‘L‘
>>> p.get_shirt_size_display()
‘Large

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

4.跨表查询一览图

#一对一查询

# 正向查询:手机号为13245的作者的姓名
deital_obj = models.AuthorDeital.objects.filter(tel="").first() print(deital_obj.author.name) # 反向查询:查询作者韩寒的手机号
author_obj = models.Author.objects.filter(name="韩寒").first() print(author_obj.authordeital.tel) #可以看出来,一对一就如同将两个表何为一个表,然后一个表起两个名字似的 #一对多查询 # 正向查询:查询《金鳞岂是池中物》的出版社的地址 # 找到《金鳞岂是池中物》那一条记录对象
book_obj = models.Book.objects.filter(title="金鳞岂是池中物")[0] print(book_obj.publish) # 拿到的是关联出版社的对象
print(book_obj.publish.addr) #出版《金鳞岂是池中物》的那家出版社的地址 # 反向查询:查询人民出版社出版过的所有的书的名字 #找到叫‘人民出版社’的出版社记录(对象)
pub_obj = models.Publish.objects.filter(name="人民出版社")[0]
# 叫‘人民出版社出版’的出版社 出版的所有书的对象集合
book_list=publish.book_set.all()
#用for循环遍历查询出每本书的名字
for book_obj in book_list:
print(book_obj.title) #多对多查询记录 # 正向查询:查询《金鳞岂是池中物》这本书的所有的作者的姓名和年龄
book_obj = models.Book.objects.filter(title="金鳞岂是池中物")[0] #找到书的记录(对象)
print(book_obj.authorlist.all().values("name", "age")) # 这本书关联的所有作者对象的集合,注意这里又表现出了一对一的本质是二表合一的特性 # 反向查询:查询作者‘兰陵笑笑生’ 出了哪几本书
lan_obj = models.Author.objects.filter(name="兰陵笑笑生")[0]#找到作者的记录(对象)
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. Dom4j解析

    dom4j-1.6.1.jar, 这个包提供了xml解析相关的方法. 这里做一个记录,微信公众号里需要对HttpServletRequest做解析,实际上也可以用dom4j提供的方法进行解析转换. 这 ...

  2. hadoop第一个例子

    Java.io.URL 1.编写java程序 package com.company; import java.io.IOException; import java.io.InputStream; ...

  3. vim指令

    编辑-->输入: i: 在当前光标所在字符的前面,转为输入模式: a: 在当前光标所在字符的后面,转为输入模式: o: 在当前光标所在行的下方,新建一行,并转为输入模式: I:在当前光标所在行的 ...

  4. Java 下载 HLS (m3u8) 视频

    下载索引文件 public String getIndexFile() throws Exception{ URL url = new URL(originUrlpath); //下载资源 Buffe ...

  5. 在 Web 页面使用 VLC 插件播放 m3u8 视频流 (360 极速模式)

    1. 背景 公司有个旧项目需要添加在线播放 m3u8 视频流,但是该流不知道什么原因使用 Video.js 或 hls.js 均无法播放,最后找到解决方案可使用 VLC 插件播放(360 极速模式下) ...

  6. POJ 2823 滑动窗口 单调队列

    https://vjudge.net/problem/POJ-2823 中文:https://loj.ac/problem/10175 题目 给一个长度为 $N$ 的数组,一个长为 $K$ 的滑动窗体 ...

  7. 一、Java多人博客系统-开篇

    作为一个程序员,工作之外的不断学习是必须的.这个项目是我个人课外学习和练手的项目.最开始是一个个人网站.当时发现京东云可以免费部署网站的,就立即写了一个网站,当时就使用jsp技术,可以实现发布博客.评 ...

  8. Civil 3D 二次开发 创建AutoCAD对象—— 00 ——

    不积跬步无以至千里,不积小流无以成江海.虽然创建一条直线.添加一个图层这样的小程序没有什么实际意义(内部命令很简单就可以完成),但对于初学二次开发的您来说,这可是一大步,这一步跨出去,您就跨进了二次开 ...

  9. windows常用服务命令

    windows运行打开服务命令的方法 :在开始->运行,输入以下命令 gpedit.msc-----组策略 sndrec32-------录音机 Nslookup-------IP地址侦测器 e ...

  10. Codeforces Round #470 Div. 1

    A:暴力枚举x2的因子,由此暴力枚举x1,显然此时减去其最大质因子并+1即为最小x0. #include<iostream> #include<cstdio> #include ...