django【orm操作】
一、ORM表结构
- 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 = models.CharField(max_length=30)
- country = models.CharField(max_length=50)
- website = models.URLField()
- class Meta:
- verbose_name = '出版商'
- verbose_name_plural = verbose_name
- def __str__(self):
- return self.name
- class Author(models.Model):
- name = models.CharField(max_length=30)
- def __str__(self):
- return self.name
- class AuthorDetail(models.Model):
- sex = models.BooleanField(max_length=1, choices=((0, '男'),(1, '女'),))
- email = models.EmailField()
- address = models.CharField(max_length=50)
- birthday = models.DateField()
- author = models.OneToOneField(Author)
- class Book(models.Model):
- title = models.CharField(max_length=100)
- authors = models.ManyToManyField(Author)
- publisher = models.ForeignKey(Publisher)
- publication_date = models.DateField()
- price=models.DecimalField(max_digits=5,decimal_places=2,default=10)
- def __str__(self):
- 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
- #一对多和多对多在这里用法没区别
django【orm操作】的更多相关文章
- [oldboy-django][2深入django]ORM操作
推荐学习博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 需求: 汇总django orm操作,代替原生mysql语句来操作数据库:里面内 ...
- Django学习——静态文件配置、request对象方法、pycharm如何链接数据库、Django如何指定数据库、Django orm操作
静态文件配置 # 1.静态文件 网站所使用的已经提前写好的文件 css文件 js文件 img文件 第三方文件 我们在存储静态文件资源的时候一般默认都是放在static文件夹下 # 2.Django静态 ...
- Django ORM 操作 必知必会13条 单表查询
ORM 操作 必知必会13条 import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTIN ...
- django -orm操作总结
前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MyS ...
- python 终级篇 django ---ORM操作
一般操作 必会的 ...
- Django ORM操作及进阶
一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...
- django orm 操作
django的orm使用方便,但对于一些复杂的操作,需要遵循特定的规范,特例特别记录一下: 模型: from django.db import models class Blog(models.Mod ...
- Django ORM操作
ORM 常用操作进阶操作 #!/usr/bin/env python #_*_ coding:utf8 _*_ from __future__ import unicode_literals from ...
- Django ORM操作补充
操作补充 only 只取某些去除其他 defer 去除某些取其他 # 需求: 只取某n列 queryset=[ {},{}] models.User.objects.all().values( 'id ...
- Python Django orm操作数据库笔记之QuerySet API
什么时候Django会将QuerySet转换为SQL去执行: 根据Django的数据库机制,对于QuerySet来说,当QuerySet被第一次构建,然后又调用他的filter方法,接着在对其进行切片 ...
随机推荐
- treeMap,key排序,value排序
HashMap与TreeMap按照key和value排序 使用一个场景是mapreduce中用解决topn问题是用value 排序 topn MapReducetopN
- POSTGRESQL 9.1 FATAL: password authentication failed for user "postgres"
1.配置postgreql 可以远程访问: sudo vim /etc/postgresql/9.1/main/postgresql.conf root@ubuntuserver:~# sudo vi ...
- 用e2fsck修复受损的linux文件系统
今天想尝试直接从linux deepin拷贝一些文件到windows 10而不重启电脑,所以就安装Ext2Mgr了并加载了linux的几个磁盘: / /home 再次重启系统想进入linux的时发现系 ...
- C#连接各种数据库的方法(文档)
1.C#连接连接Access程序代码: ------------------------------------------------------------------------------- ...
- Firefox模拟手机访问手机网站
说明: 此方法只能用以那些以识别UA来判断的网站 使用步骤: 第一步:打开Firefox,点击菜单,工具-〉附加组件-〉获取附加组件: 第二步:查询安装三个组件:User Agent Switcher ...
- curl使用例子
地址:http://phpbook.phpxy.com/34771 参考:http://php.net/manual/zh/function.curl-setopt.php 我们将curl的步骤分为以 ...
- (转)java volatile关键字
转自:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 参考:http://blog.csdn.net/imzoer/ar ...
- Java逍遥游记读书笔记<三>
异常处理 如何判断一个方法中可能抛出异常 该方法中出现throw语句 该方法调用了其他已经带throws子句的方法. 如果方法中可能抛出异常,有两种处理方法: 1.若当前方法有能力处理异常,则用Try ...
- 面试心得与总结—BAT、网易、蘑菇街 - ImportNew
1. 九种基本数据类型的大小,以及他们的封装类. 2. Switch能否用string做参数? 3. equals与==的区别. 4. Object有哪些公用方法? 5. Java的四种引用,强弱软虚 ...
- python 之 多线程
一.多线程(具体可参照博文多进程---->http://www.cnblogs.com/work115/p/5621789.html) 1.函数式实现多线程 2.类实现多线程 3.多线程之线程锁 ...