一、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增加数据

  1. from app01.models import *
  2.  
  3. 一、单表增加数据
  4. #create方式一: Author.objects.create(name='Alvin')
  5. #create方式二: Author.objects.create(**{"name":"alex"})
  6. #save方式一: author=Author(name="alvin")
  7. author.save()
  8. #save方式二: author=Author()
  9. author.name="alvin"
  10. author.save()
  11.  
  12. 二、1对多增加数据
  13. #方式一:
  14. #Book.objects.create(title='vb',publisher_id=1, publication_date="2016-7-7",price=198)
  15. #方式二:
  16. #publisher_obj = Publisher.objects.get(id=3)
  17. #Book.objects.create(title='vb',publisher=publisher_obj, publication_date="2016-7-7",price=198)
  18. 备注:将 publisher_id=2 改为 publisher=publisher_obj
  19.  
  20. 三、多对多增加数据
  21. 1.#为id=1这本书增加2个作者。将数据增加到第三张表中
  22. # 正向增加
  23. author1=Author.objects.get(id=1)
  24. author2=Author.objects.filter(name='alvin')[0]
  25. book=Book.objects.filter(id=1)[0]
  26. book.authors.add(author1,author2)
  27.  
  28. 2.#反向增加
  29. #将多本书增加到一个作者
  30. book=models.Book.objects.filter(id__gt=1)
  31. authors=models.Author.objects.filter(id=1)[0]
  32. authors.book_set.add(*book)
  33. authors.book_set.remove(*book)
  34.  
  35. 3.如果第三张表是通过models.ManyToManyField()自动创建的,那么绑定关系只有上面一种方式
  36. #如果第三张表是自己创建的:
  37. class Book2Author(models.Model):
  38. author=models.ForeignKey("Author")
  39. Book= models.ForeignKey("Book")
  40. #那么就还有一种方式:
  41. author_obj=models.Author.objects.filter(id=2)[0]
  42. book_obj =models.Book.objects.filter(id=3)[0]
  43.  
  44. s=models.Book2Author.objects.create(author_id=1,Book_id=2)
  45. s.save()
  46. s=models.Book2Author(author=author_obj,Book_id=1)
  47. s.save()

三、ORM删除数据

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

四、ORM更新数据

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

五、ORM查询数据

  1. 1.了不起的双下划线(__)之单表条件查询
  2. # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
  3. #
  4. # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
  5. # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
  6. #
  7. # models.Tb1.objects.filter(name__contains="ven")
  8. # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
  9. #
  10. # models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and
  11. #
  12. # startswith,istartswith, endswith, iendswith,
  13.  
  14. 2.了不起的双下划线(__)之多表条件关联查询
  15. # 正向查找(条件)
  16.  
  17. # ret3=models.Book.objects.filter(title='Python').values('id')
  18. # print(ret3)#[{'id': 1}]
  19. #正向查找(条件)之一对多 ret4=models.Book.objects.filter(title='Python').values('publisher__city')
  20. print(ret4) #[{'publisher__city': '北京'}]
  21.  
  22. #正向查找(条件)之多对多
  23. ret5=models.Book.objects.filter(title='Python').values('author__name')
  24. print(ret5)
  25. ret6=models.Book.objects.filter(author__name="alex").values('title')
  26. print(ret6)
  27.  
  28. #注意
  29. #正向查找的publisher__city或者author__name中的publisher,author是book表中绑定的字段
  30. #一对多和多对多在这里用法没区别
  31.  
  32. # 反向查找(条件)
  33.  
  34. #反向查找之一对多:
  35. ret8=models.Publisher.objects.filter(book__title='Python').values('name')
  36. print(ret8)#[{'name': '人大出版社'}] 注意,book__title中的book就是Publisher的关联表名
  37.  
  38. ret9=models.Publisher.objects.filter(book__title='Python').values('book__authors')
  39. print(ret9)#[{'book__authors': 1}, {'book__authors': 2}]
  40.  
  41. #反向查找之多对多:
  42. ret10=models.Author.objects.filter(book__title='Python').values('name')
  43. print(ret10)#[{'name': 'alex'}, {'name': 'alvin'}]
  44.  
  45. #注意
  46. #正向查找的book__title中的book是表名Book
  47. #一对多和多对多在这里用法没区别

django【orm操作】的更多相关文章

  1. [oldboy-django][2深入django]ORM操作

    推荐学习博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 需求: 汇总django orm操作,代替原生mysql语句来操作数据库:里面内 ...

  2. Django学习——静态文件配置、request对象方法、pycharm如何链接数据库、Django如何指定数据库、Django orm操作

    静态文件配置 # 1.静态文件 网站所使用的已经提前写好的文件 css文件 js文件 img文件 第三方文件 我们在存储静态文件资源的时候一般默认都是放在static文件夹下 # 2.Django静态 ...

  3. Django ORM 操作 必知必会13条 单表查询

    ORM 操作 必知必会13条 import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTIN ...

  4. django -orm操作总结

    前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MyS ...

  5. python 终级篇 django ---ORM操作

                                       一般操作                                                          必会的 ...

  6. Django ORM操作及进阶

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

  7. django orm 操作

    django的orm使用方便,但对于一些复杂的操作,需要遵循特定的规范,特例特别记录一下: 模型: from django.db import models class Blog(models.Mod ...

  8. Django ORM操作

    ORM 常用操作进阶操作 #!/usr/bin/env python #_*_ coding:utf8 _*_ from __future__ import unicode_literals from ...

  9. Django ORM操作补充

    操作补充 only 只取某些去除其他 defer 去除某些取其他 # 需求: 只取某n列 queryset=[ {},{}] models.User.objects.all().values( 'id ...

  10. Python Django orm操作数据库笔记之QuerySet API

    什么时候Django会将QuerySet转换为SQL去执行: 根据Django的数据库机制,对于QuerySet来说,当QuerySet被第一次构建,然后又调用他的filter方法,接着在对其进行切片 ...

随机推荐

  1. treeMap,key排序,value排序

    HashMap与TreeMap按照key和value排序 使用一个场景是mapreduce中用解决topn问题是用value 排序 topn MapReducetopN

  2. 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 ...

  3. 用e2fsck修复受损的linux文件系统

    今天想尝试直接从linux deepin拷贝一些文件到windows 10而不重启电脑,所以就安装Ext2Mgr了并加载了linux的几个磁盘: / /home 再次重启系统想进入linux的时发现系 ...

  4. C#连接各种数据库的方法(文档)

    1.C#连接连接Access程序代码: ------------------------------------------------------------------------------- ...

  5. Firefox模拟手机访问手机网站

    说明: 此方法只能用以那些以识别UA来判断的网站 使用步骤: 第一步:打开Firefox,点击菜单,工具-〉附加组件-〉获取附加组件: 第二步:查询安装三个组件:User Agent Switcher ...

  6. curl使用例子

    地址:http://phpbook.phpxy.com/34771 参考:http://php.net/manual/zh/function.curl-setopt.php 我们将curl的步骤分为以 ...

  7. (转)java volatile关键字

    转自:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 参考:http://blog.csdn.net/imzoer/ar ...

  8. Java逍遥游记读书笔记<三>

    异常处理 如何判断一个方法中可能抛出异常 该方法中出现throw语句 该方法调用了其他已经带throws子句的方法. 如果方法中可能抛出异常,有两种处理方法: 1.若当前方法有能力处理异常,则用Try ...

  9. 面试心得与总结—BAT、网易、蘑菇街 - ImportNew

    1. 九种基本数据类型的大小,以及他们的封装类. 2. Switch能否用string做参数? 3. equals与==的区别. 4. Object有哪些公用方法? 5. Java的四种引用,强弱软虚 ...

  10. python 之 多线程

    一.多线程(具体可参照博文多进程---->http://www.cnblogs.com/work115/p/5621789.html) 1.函数式实现多线程 2.类实现多线程 3.多线程之线程锁 ...