django orm 重点大全

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="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())  # 与该作者关联的所有书对象的集合

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python

Django---ORM操作大全

前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:...

83810
来自专栏猿人谷

mybatis调用视图和存储过程

    现在的项目是以Mybatis作为O/R映射框架,确实好用,也非常方便项目的开发。MyBatis支持普通sql的查询、视图的查询、存储过程调用,是一种非常...

2645
来自专栏更流畅、简洁的软件开发方式

分页控件之分页算法 —— for SQL Server 版。

上两篇随笔: 我的分页控件(未完,待续)——控件件介绍及思路 我自己写的一个分页控件(源码和演示代码)PostBack分页版 for vs2003、SQL ...

2189
来自专栏北京马哥教育

必备神技能 | MySQL 查找删除重复行

来源:码农有道 ID:b497155298 本文讲述如何查找数据库里重复的行。这是初学者十分普遍遇到的问题。方法也很简单。这个问题还可以有其他演变,例如,如何...

4709
来自专栏Java帮帮-微信公众号-技术文章全总结

Oracle应用实战八(完结)——存储过程、函数+对象曹组

游标 在写java程序中有结果集的概念,那么在pl/sql中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据。 游标可以理解为是PL/S...

3506
来自专栏V站

Python的flask:models.py来创建mysql数据库

3816
来自专栏zingpLiu

python【第十二篇下】操作MySQL数据库以及ORM之 sqlalchemy

  对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程...

941
来自专栏Java进阶之路

IK分词器访问远程词典功能实现

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最...

2062
来自专栏分布式系统进阶

FBString分析与使用FBString简介

简单来说,使用了三层存储策略+内存分配策略+大小端支持,特别是配合使用 jemalloc, 减少磁盘碎片,加快并发下的分配速度和性能。

1792
来自专栏ShaoYL

iOS---小经验分享

2776

扫码关注云+社区