一、ORM表结构

 1 class Publisher(models.Model):
 2     name = models.CharField(max_length=30, verbose_name="名称")
 3     address = models.CharField("地址", max_length=50)
 4     city = models.CharField('城市',max_length=60)
 5     state_province = models.CharField(max_length=30)
 6     country = models.CharField(max_length=50)
 7     website = models.URLField()
 8
 9     class Meta:
10         verbose_name = '出版商'
11         verbose_name_plural = verbose_name
12
13     def __str__(self):
14         return self.name
15
16 class Author(models.Model):
17     name = models.CharField(max_length=30)
18     def __str__(self):
19         return self.name
20
21 class AuthorDetail(models.Model):
22     sex = models.BooleanField(max_length=1, choices=((0, '男'),(1, '女'),))
23     email = models.EmailField()
24     address = models.CharField(max_length=50)
25     birthday = models.DateField()
26     author = models.OneToOneField(Author)
27
28 class Book(models.Model):
29     title = models.CharField(max_length=100)
30     authors = models.ManyToManyField(Author)
31     publisher = models.ForeignKey(Publisher)
32     publication_date = models.DateField()
33     price=models.DecimalField(max_digits=5,decimal_places=2,default=10)
34     def __str__(self):
35         return self.title

 

二、ORM增加数据

from app01.models import *一、单表增加数据#create方式一:   Author.objects.create(name='Alvin')#create方式二:   Author.objects.create(**{"name":"alex"})#save方式一:     author=Author(name="alvin")
                            author.save()#save方式二:     author=Author()author.name="alvin"author.save()二、1对多增加数据 #方式一:#Book.objects.create(title='vb',publisher_id=1, publication_date="2016-7-7",price=198)#方式二:#publisher_obj = Publisher.objects.get(id=3)#Book.objects.create(title='vb',publisher=publisher_obj, publication_date="2016-7-7",price=198)备注:将 publisher_id=2 改为  publisher=publisher_obj三、多对多增加数据1.#为id=1这本书增加2个作者。将数据增加到第三张表中# 正向增加author1=Author.objects.get(id=1)author2=Author.objects.filter(name='alvin')[0]book=Book.objects.filter(id=1)[0]book.authors.add(author1,author2)2.#反向增加#将多本书增加到一个作者book=models.Book.objects.filter(id__gt=1)authors=models.Author.objects.filter(id=1)[0]authors.book_set.add(*book)authors.book_set.remove(*book)3.如果第三张表是通过models.ManyToManyField()自动创建的,那么绑定关系只有上面一种方式#如果第三张表是自己创建的:class Book2Author(models.Model):author=models.ForeignKey("Author")Book=  models.ForeignKey("Book")#那么就还有一种方式:author_obj=models.Author.objects.filter(id=2)[0]book_obj  =models.Book.objects.filter(id=3)[0]s=models.Book2Author.objects.create(author_id=1,Book_id=2)s.save()s=models.Book2Author(author=author_obj,Book_id=1)s.save()

三、ORM删除数据

1.删除BOOK表id=1的数据Book.objects.filter(id=1).delete()

2.删除一个出版社. 注意与出版相关联的书也会被删除   Publisher.objects.filter(id=3).delete()3.删除id=6这本书和作者id=1的关联(删除第三张关系表数据)book = Book.objects.filter(id=6)[0]   # 找到这本书的对象author = Author.objects.filter(id=1)[0] # 找到这个作者的对象
author.book_set.remove(book)  # 反向删除book.authors.remove(author)    # 正向删除

四、ORM更新数据

1.对象更新(所有字段更新,性能低)ret = Publisher.objects.get(id=2)ret.name = "复旦大学"ret.save()2.级联方法更新Publisher.objects.filter(id=1).update(city="北京市")

五、ORM查询数据

1.了不起的双下划线(__)之单表条件查询
# models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
#
# models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
# models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
#
# models.Tb1.objects.filter(name__contains="ven")
# models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
#
# models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and
#
# startswith,istartswith, endswith, iendswith,2.了不起的双下划线(__)之多表条件关联查询
# 正向查找(条件)# ret3=models.Book.objects.filter(title='Python').values('id')
# print(ret3)#[{'id': 1}]
#正向查找(条件)之一对多      ret4=models.Book.objects.filter(title='Python').values('publisher__city')print(ret4)  #[{'publisher__city': '北京'}]#正向查找(条件)之多对多ret5=models.Book.objects.filter(title='Python').values('author__name')print(ret5)ret6=models.Book.objects.filter(author__name="alex").values('title')print(ret6)#注意#正向查找的publisher__city或者author__name中的publisher,author是book表中绑定的字段#一对多和多对多在这里用法没区别# 反向查找(条件)#反向查找之一对多:ret8=models.Publisher.objects.filter(book__title='Python').values('name')print(ret8)#[{'name': '人大出版社'}]  注意,book__title中的book就是Publisher的关联表名
ret9=models.Publisher.objects.filter(book__title='Python').values('book__authors')print(ret9)#[{'book__authors': 1}, {'book__authors': 2}]#反向查找之多对多:ret10=models.Author.objects.filter(book__title='Python').values('name')print(ret10)#[{'name': 'alex'}, {'name': 'alvin'}]#注意#正向查找的book__title中的book是表名Book#一对多和多对多在这里用法没区别

转载于:https://www.cnblogs.com/weibiao/p/6871803.html

django【orm操作】相关推荐

  1. Django ORM操作

    Django ORM操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果<2> get(**kwargs): 返回与所给筛选条 ...

  2. Django - ORM操作

    Django - ORM操作 一. 必知必会13条 单表查询之神奇的双下划线 二. ForeignKey操作 正向查找 反向操作 三. ManyToManyField 四. 聚合查询和分组查询 聚合 ...

  3. django orm原理_django 动态创建一个模型的多个table name, 并通过 Django ORM 操作

    动态创建table, 并通过 Django ORM 操作. 动态的创建表 动态的创建模型其实就是在运行时生成 Model 类, 这个可以通过函数实现, 通过传参(今天的日期, 如: 20181211) ...

  4. django mysql orm教程_带你了解Django ORM操作(基础篇)

    前言 在日常开发中,需要大量对数据库进行增删改查操作. 如果头铁的话,使用原生SQL是最好的,毕竟性能又高,又灵活. 但是通常情况下,我们不是太需要那么苛刻的性能,也没有那么多刁钻的需求用原生SQL ...

  5. django ORM 操作

    ORM操作 select * from tb where id > 1 # 对应关系 models.tb.objects.filter(id__gt=1) models.tb.objects.f ...

  6. Django ORM

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  7. 第十八 django及ORM操作

    一.项目及ORM操作 1.添加新项目 python manage.py startapp blog 2.配置数据库类 models.py from django.db import models# C ...

  8. Django 之ORM操作

    1.什么是ORM? 全称关系对象映射Object Relational Mapping(简称ORM),是通过描述面向对象与数据库之间的对应的元数据,将对象持久化的更新到数据库中. 有了ORM,就不需要 ...

  9. Django ORM那些相关操作

    一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/         官网文档 常用的操作 <1> all() ...

  10. 【Django】ORM操作#2

    目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 ...

最新文章

  1. 在matlab中将处理结果输出为shp文件
  2. python带界面的计算器
  3. geoserver 3_使用GeoServer 和 mapbox-gl 搭建离线地图服务
  4. 如何将Android Studio项目提交(更新)到github
  5. mysql+索引+rebuild_(solr系列:五) solr定时实时重建索引和增量更新
  6. 日本最后一刻阻拦鸿海收购夏普:质疑董事私心
  7. mysql 总分区表限制_MySQL分区表的局限和限制详解
  8. java jre 和jed_需要jre的软件如何安装,如jedit?
  9. wps office2019PC版和Mac版_来试试这款政府版WPS吧
  10. c++ Dxgi+FFmpeg 完成对截图屏幕,以及将屏幕数据保存为MP4格式,以完成录屏功能
  11. 电子邮件--详解SMTP和POP3协议
  12. android+表情符号乱码,Android Emoji表情截取不完整,乱码
  13. sunShine问题
  14. 解决网络和Internet设置中只有飞行模式的问题
  15. Android NFC识别CPU卡和m1卡
  16. WSL2 Ubuntu中apt update命令报错,无法解析域名解决方法
  17. tomcat启动后出现乱码解决
  18. 中国队没进世界杯,但是其他遍地都是“中国制造”!
  19. root后充电很慢,root后开机慢
  20. Win7/8/10安装Centos7/Redhat7双系统丢失windows启动项的解决办法

热门文章

  1. Linux系统swappiness参数在内存与交换分区之间优化作用
  2. Java注解--Java深度历险(转)
  3. 快春运了,做个火车余票查询接口,余票来源12306,图是百度地图
  4. 2010中国杭州电子信息博览会通讯报道
  5. 如何在IE右键菜单中添加自定义项
  6. kali linux 2.0 web 渗透测试 电子书
  7. MHA masterha_check_ssh 报错
  8. 敏捷个人第五次练习:个人使命宣言
  9. Eboot 编译编译器决定中断向量及其实现单一性的原因
  10. hanganalyz 性能诊断工具