django中的关系字段

1、ForeignKey字段,即外键字段,对应一对多的情况,列如:一本书对应一个出版社,一个出版社可对应多本书。

2、ManyToManyFiled字段,即多对多字段,对应数据库中一个数据相互可以对应多条,列如:一本书可以有多个作者,一个作者可以有多本书

3、OneToOneFiled字段,即一对一字段,通过用来将一条数据补常用的数据单独存放,例如对于作者来说,姓名、作品等是常被查询的,而地址、生日这些是补常用的,就可以将这部分数据通过一对一字段对应分表存放

准备工作:

  1. from django.db import models
  2. # Create your models here.
  3. class Publisher(models.Model):
  4. id = models.AutoField(primary_key=True)
  5. name = models.CharField(max_length=12)
  6. addr = models.TextField()
  7. date = models.DateField()
  8. class Book(models.Model):
  9. title = models.CharField(max_length=12)
  10. price = models.DecimalField(max_digits=6,decimal_places=2)
  11. isbn = models.CharField(max_length=20,unique=True)
  12. pulisher = models.ForeignKey(to='Publisher')
  13. class Author(models.Model):
  14. name = models.CharField(max_length=12)
  15. gender=models.SmallIntegerField(choices=((1,'男'),(2,'女'),(3,'保密')),default=3)
  16. phone=models.CharField(max_length=11,unique=True)
  17. email=models.EmailField()
  18. book = models.ManyToManyField(to='Book',related_name='authors')
  19. info = models.OneToOneField(to='Authorinfo',related_name='infos')
  20. class Authorinfo(models.Model):
  21. birthday=models.DateTimeField()
  22. city=models.CharField(max_length=12)
  23. is_marry=models.BooleanField()
  24. 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脚本中:

  1. import os
  2. if __name__ == "__main__":
  3. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day65blog.settings")
  4. import django
  5. django.setup()
  6. from app01 import models
  7. #获取id =1 的数据对象
  8. obj = models.Author.objects.get(id=1)
  9. #通过.一对一字段名的方式获取信息表对象并查看属性
  10. print(obj.info.country,obj.info.city)

运行结果:

  1. 英国 伦敦

通过对象反向查询

查询国家=英国 城市=伦敦的的作者

步骤:

1、获取满足条件的作者信息表对象

2、通过.表名方法获取对象(当一对一字段有related_name参数时,用该参数的值替代表名_set)

  1. from django.db import models
  2. # Create your models here.
  3. class Author(models.Model):
  4. #姓名字段
  5. name = models.CharField(max_length=12)
  6. #性别字段,choices参数对应选择1、2、3
  7. gender = models.SmallIntegerField(choices=((1,'男'),(2,'女'),(3,'保密')),default=3)
  8. #一对一字段,related_name参数为反向查找时的别名。没有别名反向查找时用
  9. info = models.OneToOneField(to='Authorinfo',related_name='infos')
  10. class Authorinfo(models.Model):
  11. #年龄字段
  12. age = models.SmallIntegerField()
  13. #国籍
  14. country = models.CharField(max_length=12)
  15. #城市
  16. city = models.CharField(max_length=12)
  1. import os
  2. if __name__ == "__main__":
  3. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day65blog.settings")
  4. import django
  5. django.setup()
  6. from app01 import models
  7. #获取信息表对象
  8. obj = models.Authorinfo.objects.get(country='英国',city='伦敦')
  9. #通过related_name='infos'反向查询
  10. print(obj.infos.get_gender_display())

如果 info = models.OneToOneField(to='Authorinfo',related_name='infos')中没有related_name参数,则是如下:

  1. import os
  2. if __name__ == "__main__":
  3. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day65blog.settings")
  4. import django
  5. django.setup()
  6. from app01 import models
  7. #获取信息表对象
  8. obj = models.Authorinfo.objects.get(country='英国',city='伦敦')
  9. #通过表名(小写)反向查询
  10. print(obj.author.get_gender_display())

通过qureset查询

正向查询

查询id=1的作者的国家

步骤:

1、获取作者query对象

2、通过字段__方法

  1. #正向查找
  2. #获取queryset数据
  3. ret = models.Author.objects.filter(id=1)
  4. #通过字段__方法调用属性
  5. print(ret.values('info__city'))
  6. #运行结果:
  7. # < QuerySet[{'info__city': '伦敦'}] >

反向查询

  1. #反向查询
  2. # 获取queryset数据
  3. ret = models.Authorinfo.objects.filter(city='伦敦')
  4. # 通过表名__方法调用属性
  5. # 如果一对一字段有设置related_name参数=infos,表名__=infos
  6. print(ret.values('author__name'))

ForeignKey

书籍应出版社为1对多关系即为外键

通过对象正向查询

查询id=1的书籍的出版社,方法:对象.关联字段.外表字段

  1. #获取对象
  2. obj =Book.objects.get(id=1)
  3. #对象.字段名.外表属性
  4. print(obj.pulisher.name)

通过对象反向查询

查询出版社id=1 的出版社出版的书籍

  1. #获取出版社对象
  2. ret = Publisher.objects.get(id=1)
  3. #对象.表名_set(反向一对多用,反向一对一为对象.表名)得到反向表对象然后调用方法
  4. ret.book_set.all()

通过qureset查询

  1. #正向查询书籍id=1的出版社
  2. ret = Book.objects.filter(id=1)
  3. print(ret.values('pulisher__name'))
  4. #反向查询id=1出版社出版的书
  5. ret2= Publisher.objects.filter(id=1)
  6. print(ret2.values('book__title'))

ManyToManyField

书籍和作者之间为多对多关系

  1. #通过对象查询
  2. #反向查询related_name = authors
  3. obj = Book.objects.get(id=1)
  4. obj.authors.all()
  5. #正向查询
  6. obj1 = Author.objects.get(id=1)
  7. obj1.book.all()
  8. #通过queryset查询
  9. #正向查询
  10. print(Author.objects.filter(id=1).values('book__title'))
  11. #反向查询
  12. print(Book.objects.filter(id=1).values('authors__name'))

总结:

django--orm关系字段(ForeignKey、OneToOneField、ManyToManyField)详解的更多相关文章

  1. Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段

    单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...

  2. Django orm常用字段和字段参数

    1.Object Relational Mapping(ORM) 1.1ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象 ...

  3. Django ORM常用字段和参数

    常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型,范围 ...

  4. Django(ORM常用字段)

    day68 参考:http://www.cnblogs.com/liwenzhou/p/8688919.html 1. Django ORM常用字段:             1. AutoField ...

  5. Django ORM 常用字段和参数

    Django ORM 常用字段和参数 一:常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. I ...

  6. ORM框架对比以及Mybatis配置文件详解

    ORM框架对比以及Mybatis配置文件详解 0.数据库操作框架的历程 (1) JDBC ​ JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句 ...

  7. 【ORM】--FluentNHibernate之基本映射详解

           最近在做项目的时候用到了NHibernate,使用它并不困难,但是很麻烦.如果我的数据库有几百张表如果想要一个个的映射岂不是很麻烦,所以这种情况下使用NHibernate就会很笨重,虽然 ...

  8. Django:ORM关系字段

    一,ForeignKey 外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方. ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系 ...

  9. django orm 时间字段讲解

    创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime().date().time()三中对象 ...

随机推荐

  1. mysql中添加索引

    创建普通索引 alter table xxxxxx add index index_name(xxxxxxx) 表名↑                                        列 ...

  2. AbstractQueuedSynchronizer

    1 简介 AbstractQueuedSynchronizer简称AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器.JDK1.5中提供的java.util.concurrent包中的大多数的 ...

  3. springboot 集成 jpa/hibernate

    pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  4. 03 Django REST Framework 视图和路由

    01-DRF中的request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别 ...

  5. itoa函数实现

    1.      整数字符转化为字符串数 // 将整数转换成字符串数,不用函数itoa // 思路:采用加'0',然后在逆序的方法 #include <iostream> using nam ...

  6. PS调出通透唯美阳光外景女生照片

    1.稍微增加了一点曝光度,让照片更明亮. 2.对比度的话我现在比习惯加一点,而且 一般导入PS之后我还会按照片情况去加对比度. 3.高光的部分一般会拉回来一点,根据照片调. 4.阴影部分加一点的话会让 ...

  7. Debian搭建WordPress

    环境配置 可以使用apt-get快速安装mysql,php5:我是用源码手动安装apache服务器的.安装完mysql后,最好将字符编码设置为utf8的. 接下来就是mysql,apache,php5 ...

  8. rest-framework频率组件

    throttle(访问频率)组件 1.局部视图throttle from rest_framework.throttling import BaseThrottle VISIT_RECORD={} c ...

  9. [2017BUAA软工助教]团队alpha得分总表

    一.累计得分 项目 介绍 采访 贡献分 功能 技术 α例会 α发布 α测试 α展示 α事后 合计 满分 10 10 10 10 10 50 10 10 150 10 280 hotcode5 10 9 ...

  10. 软工网络15团队作业4——Alpha阶段敏捷冲刺

    Deadline: 2018-4-29 10:00PM,以提交至班级博客时间为准. 根据以下要求,团队在日期区间[4.16,4.29]内,任选8天进行冲刺,冲刺当天晚10点前发布一篇随笔,共八篇. 另 ...