django--orm关系字段(ForeignKey、OneToOneField、ManyToManyField)详解
django中的关系字段
1、ForeignKey字段,即外键字段,对应一对多的情况,列如:一本书对应一个出版社,一个出版社可对应多本书。
2、ManyToManyFiled字段,即多对多字段,对应数据库中一个数据相互可以对应多条,列如:一本书可以有多个作者,一个作者可以有多本书
3、OneToOneFiled字段,即一对一字段,通过用来将一条数据补常用的数据单独存放,例如对于作者来说,姓名、作品等是常被查询的,而地址、生日这些是补常用的,就可以将这部分数据通过一对一字段对应分表存放
准备工作:
from django.db import models
# Create your models here.
class Publisher(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=12)
    addr = models.TextField()
    date = models.DateField()
class Book(models.Model):
    title = models.CharField(max_length=12)
    price = models.DecimalField(max_digits=6,decimal_places=2)
    isbn = models.CharField(max_length=20,unique=True)
    pulisher = models.ForeignKey(to='Publisher')
class Author(models.Model):
    name = models.CharField(max_length=12)
    gender=models.SmallIntegerField(choices=((1,'男'),(2,'女'),(3,'保密')),default=3)
    phone=models.CharField(max_length=11,unique=True)
    email=models.EmailField()
    book = models.ManyToManyField(to='Book',related_name='authors')
    info = models.OneToOneField(to='Authorinfo',related_name='infos')
class Authorinfo(models.Model):
    birthday=models.DateTimeField()
    city=models.CharField(max_length=12)
    is_marry=models.BooleanField()
    income = models.BigIntegerField()
ForeiKeyField
2、运行django命令:python manage.py makemigrations  和 python manage.py migrate
3、在数据库中添加数据:
作者表:

作者信息表:

查询数据的方式:
查询数据方法主要分为两种方式:通过对象查询和通过qureset数据查询,其中每种方式还对应正向查询和反向查询,解释:例如在上面两个表中,一对一字段在作者表中那么根据作者表查信息表就是正向查询,反之为反向查询
ForeiKeyField正向查询
通过对象正向查询
例如查询id=1的作者的详细信息:
步骤:
1、获取id=1的作者对象
2、通过一对一字段获取对象
3、调用字段属性
在django脚本中:
import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day65blog.settings")
    import django
    django.setup()
    from app01 import models
    #获取id =1 的数据对象
    obj  = models.Author.objects.get(id=1)
    #通过.一对一字段名的方式获取信息表对象并查看属性
    print(obj.info.country,obj.info.city)
运行结果:
英国 伦敦
通过对象反向查询
查询国家=英国 城市=伦敦的的作者
步骤:
1、获取满足条件的作者信息表对象
2、通过.表名方法获取对象(当一对一字段有related_name参数时,用该参数的值替代表名_set)
from django.db import models
# Create your models here.
class Author(models.Model):
    #姓名字段
    name = models.CharField(max_length=12)
    #性别字段,choices参数对应选择1、2、3
    gender = models.SmallIntegerField(choices=((1,'男'),(2,'女'),(3,'保密')),default=3)
    #一对一字段,related_name参数为反向查找时的别名。没有别名反向查找时用
    info = models.OneToOneField(to='Authorinfo',related_name='infos')
class Authorinfo(models.Model):
    #年龄字段
    age = models.SmallIntegerField()
    #国籍
    country = models.CharField(max_length=12)
    #城市
    city = models.CharField(max_length=12)
import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day65blog.settings")
    import django
    django.setup()
    from app01 import models
    #获取信息表对象
    obj = models.Authorinfo.objects.get(country='英国',city='伦敦')
    #通过related_name='infos'反向查询
    print(obj.infos.get_gender_display())
如果 info = models.OneToOneField(to='Authorinfo',related_name='infos')中没有related_name参数,则是如下:
import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day65blog.settings")
    import django
    django.setup()
    from app01 import models
    #获取信息表对象
    obj = models.Authorinfo.objects.get(country='英国',city='伦敦')
    #通过表名(小写)反向查询
    print(obj.author.get_gender_display())
通过qureset查询
正向查询
查询id=1的作者的国家
步骤:
1、获取作者query对象
2、通过字段__方法
#正向查找
    #获取queryset数据
    ret = models.Author.objects.filter(id=1)
    #通过字段__方法调用属性
    print(ret.values('info__city'))
    #运行结果:
    # < QuerySet[{'info__city': '伦敦'}] >
反向查询
#反向查询
    # 获取queryset数据
    ret = models.Authorinfo.objects.filter(city='伦敦')
    # 通过表名__方法调用属性
    # 如果一对一字段有设置related_name参数=infos,表名__=infos
    print(ret.values('author__name'))
ForeignKey
书籍应出版社为1对多关系即为外键
通过对象正向查询
查询id=1的书籍的出版社,方法:对象.关联字段.外表字段
   #获取对象
    obj =Book.objects.get(id=1)
    #对象.字段名.外表属性
    print(obj.pulisher.name)
通过对象反向查询
查询出版社id=1 的出版社出版的书籍
#获取出版社对象
    ret = Publisher.objects.get(id=1)
    #对象.表名_set(反向一对多用,反向一对一为对象.表名)得到反向表对象然后调用方法
    ret.book_set.all()
通过qureset查询
    #正向查询书籍id=1的出版社
    ret = Book.objects.filter(id=1)
    print(ret.values('pulisher__name'))
    #反向查询id=1出版社出版的书
    ret2= Publisher.objects.filter(id=1)
    print(ret2.values('book__title'))
ManyToManyField
书籍和作者之间为多对多关系
   #通过对象查询
    #反向查询related_name = authors
    obj = Book.objects.get(id=1)
    obj.authors.all()
    #正向查询
    obj1 = Author.objects.get(id=1)
    obj1.book.all()
    #通过queryset查询
    #正向查询
    print(Author.objects.filter(id=1).values('book__title'))
    #反向查询
    print(Book.objects.filter(id=1).values('authors__name'))
总结:

django--orm关系字段(ForeignKey、OneToOneField、ManyToManyField)详解的更多相关文章
- Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段
		单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ... 
- Django orm常用字段和字段参数
		1.Object Relational Mapping(ORM) 1.1ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象 ... 
- Django ORM常用字段和参数
		常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型,范围 ... 
- Django(ORM常用字段)
		day68 参考:http://www.cnblogs.com/liwenzhou/p/8688919.html 1. Django ORM常用字段: 1. AutoField ... 
- Django ORM 常用字段和参数
		Django ORM 常用字段和参数 一:常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. I ... 
- ORM框架对比以及Mybatis配置文件详解
		ORM框架对比以及Mybatis配置文件详解 0.数据库操作框架的历程 (1) JDBC  JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句 ... 
- 【ORM】--FluentNHibernate之基本映射详解
		最近在做项目的时候用到了NHibernate,使用它并不困难,但是很麻烦.如果我的数据库有几百张表如果想要一个个的映射岂不是很麻烦,所以这种情况下使用NHibernate就会很笨重,虽然 ... 
- Django:ORM关系字段
		一,ForeignKey 外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方. ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系 ... 
- django  orm   时间字段讲解
		创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime().date().time()三中对象 ... 
随机推荐
- CF429E Points and Segments 构造、欧拉回路
			传送门 如果把一条线段\([l,r]\)看成一条无向边\((l,r+1)\),从\(l\)走到\(r+1\)表示线段\([l,r]\)染成红色,从\(r+1\)走到\(l\)表示线段\([l,r]\) ... 
- Java多线程核心技术(四)Lock的使用
			本文主要介绍使用Java5中Lock对象也能实现同步的效果,而且在使用上更加方便. 本文着重掌握如下2个知识点: ReentrantLock 类的使用. ReentrantReadWriteLock ... 
- HBase篇(2)-数据模型与操作
			HBase其实就是一个数据库,无非就是存储和增删改查,那我们先从数据模型说起把 这里有一张表,是用关系型数据库的思维画出来的表,这样比较易于理解: 概念 Table(表格) 没啥说的,和关系型数据库一 ... 
- 001-电脑操作规范-2019年03月.doc
			001-电脑操作规范-2019年03月.doc 本文作者:徐晓亮 BoAi 作者腾讯QQ号码:595076941 /////////////////////////////////////// ... 
- 使用fiddlercore修改网页的返回内容
			最近研究了一下FiddlerCore,发现这是个非常强大的工具.可以用来采集网页.修改网页数据.开发页游外挂等等. 使用这个工具,需要掌握一定的html和http知识,官方网站上也有例子可以下载. 看 ... 
- mysql数据库和JDBC学习
			数据库概念: 数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. ---------数据库服务器,mysql(管理) 数据库服务器---->N多库-- ... 
- php获取URL扩展名
			一切拿代码来说话: 举例:'http://www.sina.com.cn/abc/de/fg.php?id=1': $url = 'http://www.sina.com.cn/abc/de/fg.p ... 
- 优化MySQL性能的几种方法-总结
			原文:http://bbs.landingbj.com/t-0-245601-1.html 1.要选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越 小,在它上 ... 
- 理解npm、nvm、nodejs之间的关系
			nvm nvm:nodeJs版本管理工具,管理nodejs版本和npm版本,使用nvm安装nodejs时会将npm一起安装下来 nodejs nodeJs: 一种高效的JavaScript运行环境 n ... 
- text-decoration、text-decoration-color、text-decoration-line、text-decoration-style属性
			text-decoration:over-line 定义上划线 text-decoration:line-through 定义删除线 text-decoration:underline 定义下划 ... 
