Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >django orm 重点大全

django orm 重点大全

作者头像
玩蛇的胖纸
发布于 2018-06-08 05:03:16
发布于 2018-06-08 05:03:16
80100
代码可运行
举报
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#用户类型表
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.最简单的多表联查,查询外键表中符合主表的主表的条件的记录列表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#主表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.建立这四个表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#一对一    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字段必须要知道的一些属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(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.跨表查询一览图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#一对一查询

# 正向查询:手机号为13245的作者的姓名
deital_obj = models.AuthorDeital.objects.filter(tel="13245").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())  # 与该作者关联的所有书对象的集合
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django ORM 数据库常用操作
ORM 一对多的使用:: 比如说一个出版社可以出版多本书,但是一本书只能够在一个出版社进行发表,这就是一个典型的一对多的关系,一对多models.ForeignKey(),如下我们首先创建一个Book表,然后创建一个Publish表,一个Publish记录中可以包含多本书.
王瑞MVP
2022/12/28
7810
Django ORM 多表操作(二)
注意:MySQL 中的 limit 相当于 ORM 中的 QuerySet 数据类型的切片,annotate 里面放聚合函数
HammerZe
2022/03/25
1.1K0
Django ORM 多表操作(二)
Django学习笔记之Models与ORM操作
一、ORM增加 from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30, verbose_name="名称") address = models.CharField("地址", max_length=50) city = models.CharField('城市',max_length=60) state_province = model
Jetpropelledsnake21
2018/07/05
1.2K0
django--ORM的单表操作
它的作用相当于 在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件
py3study
2018/08/03
1K0
Django之ORM对数据库操作
基本操作 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> values(*field): 返回一个ValueQu
人生不如戏
2018/04/11
1.3K0
六、Django学习之基于下划线的跨表查询
六、Django学习之基于下划线的跨表查询 一对一 正向查询的例子为 已知用户名,查询用户的电话号码。反向查询例子反之。 正向查询 其中下划线前的表示表名,无下划线的表示的是Author表 result = models.Author.objects.filter(name='admin').values("authorDetail__telephone",'name','age') 反向查询 values可以不写,则去除能拿到的全部数据。filter中的双下划线表示联表 result = mode
Dreamy.TZK
2020/04/09
5810
Python Day16 Django
django-admin startproject 项目名 在项目名目录下创建应用 python manage.py startapp blog 在project/settings.py中加入app
py3study
2020/01/10
1.9K0
Python Day16 Django
python 终级篇 django --
                                   一般操作                                             
py3study
2020/01/19
2.9K0
python 终级篇 django --
Django——model基础
ORM 映射关系:     表名 <-------> 类名 字段 <-------> 属性     表记录 <------->类实例对象 创建表(建立模型) 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄。 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和作者模型之间是一对一的关系(one-to-one) 出版商模型:出版商有名称,所在城市以及email。 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作
用户1214487
2018/01/24
1.1K0
Django——model基础
ORM初识和数据库操作
这样写上以后django会默认的就去链接数据库,这时你会看到报错了,那么解决的办法就是下面的这样
全栈程序员站长
2022/07/21
2.6K0
Django学习笔记之ORM多表操作
作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和作者模型之间是一对一的关系(one-to-one)
Jetpropelledsnake21
2018/08/10
2.8K0
Django学习笔记之ORM多表操作
Django ORM 多表操作
ps:外键字段不需要写表名_id后面的_id,ORM创建的时候自动添加了_id,以及外键以虚拟字段的形式存在
HammerZe
2022/03/25
1.8K0
Django ORM 多表操作
06.Django基础五之django模型层(二)多表操作
    一对一、多对一、多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束。
changxin7
2019/09/29
2.7K0
Django之模型层(多表操作)
  一本书只有一个出版社,一个出版社可以出版多本书,从而书与出版社之间就构成一对多关系,书是‘多’的一方,出版社是‘一’的一方,我们在建立模型的时候,把外键写在‘多’的一方,即我们要把外键写在book类。
py3study
2020/01/19
6230
django--图书管理系统(项目)
django创建一个新的项目 设置静态文件,更改settings配置,在最后添加 STATICFILES_DIRS = [     os.path.join(BASE_DIR, 'static'),
py3study
2018/08/03
6510
Django---ORM操作大全
前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 ORM是什么?:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 类名对应------》数据库中的表名 类属性
用户1214487
2018/01/24
7K1
Django---ORM操作大全
Django 模型层之多表操作
Django还提供了一种直观而搞笑的方式在查询(lookups)种表示关联关系,它能自动确认SQL JOIN联系。要做跨关系查询,就使用两个下划线来连接模型(model)间关联字段的名称,知道最终链接到你想要的model为止。
py3study
2020/01/18
1.3K0
Django ORM那些相关操作
一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/         官网文档 常用的操作 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <4> e
新人小试
2018/04/12
2.3K0
Python进阶29-ORM介绍
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
4.6K0
Python进阶29-ORM介绍
五、Django基于对象的跨表查询
关系属性(字段)写在哪个类(表)里面,从当前类(表)的数据去查询它关联类(表)的数据叫做正向查询,反之叫做反向查询
Dreamy.TZK
2020/04/09
1.2K0
相关推荐
Django ORM 数据库常用操作
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文