什么是表内自关联

表内自关联是指表内数据相关联的对象和表是相同字段,这样我们就直接用表内关联将外键关联设置成自身表的字段。同样表内关联也分一对多字段和多对多字段

例如:对于微博评论,每条评论都可能有子评论,但每条评的字段内容应该都是相同的,并且每条评论都只有一个父评论,这就满足了,一对多的情形。父评论为关联字段,可以对应多个子评论,这就是一对多的自关联。

创建自关联表(一对多情景)

在django项目的models中创建评论表。

#评论表
class Comment(models.Model):
#评论的内容字段
content=models.CharField(max_length=255)
#评论的发布时间
push_time=models.DateTimeField(auto_now_add=True)
#关联父评论的id,可以为空
pcomment = models.ForeignKey(to='self',null=True)
def __str__(self):
return self.content

添加数据,第一条数据关联字段为空,说明是父评论,第二条数据关联了第一条数据说明是第一条数据的字评论,同样后两条数据是是第二条数据的子评论



接下来查找第一条数据的子评论:

#第一条数据的id是1,可以通过筛选父评论关联字段等于1的对象
print(Comment.objects.filter(pcomment_id=1)) #根据子评论关联id正向查找父评论的内容
print(Comment.objects.filter(pcomment_id=2).values('pcomment__content')) #根据父评论的id反向查找子评论
print(Comment.objects.filter(id=1).values('comment__id'))

注意:外键关联是在子评论中,有关联字段的是子评论,子评论查父评论是正向,父评论查子评论是反向。

多对多表自关联

建立一张表,表字段为姓名以及朋友多对多字段,一个人可有多个朋友,也可以是多个人的朋友,找一个人的朋友是正向查找,找是某个人的朋友是反向查找。

class Person(models.Model):
name = models.CharField(max_length=12)
#人和人交朋友
friends = models.ManyToManyField(to='self',symmetrical=False,related_name='ship')
def __str__(self):
return self.name

添加数据:



    # 查找沁阳的基友
#正向查找关联字段__name
print(Person.objects.filter(name='沁阳').values('friends__name')) # 反向查找沁阳的基友
# print(Person.objects.all().filter(ship__name='沁阳')) # 查找王帅的基友
# 正向查找关联字段__name,王帅是沁阳的朋友但王帅的朋友是空,因为王帅没有关联别人
print(Person.objects.get(name='王帅').friends.all()) #反向查找是王帅朋友的人,也是空
print(Person.objects.filter(ship__name='王帅')) # 基友是沁阳的那个人反向查找
print(Person.objects.get(name='沁阳').ship.all())
#基友是王帅的那个人反向查找
# print(Person.objects.get(name='王帅').ship.all()) # 基友含有沁阳的人反向
print(Person.objects.filter(name='沁阳').values('ship__name'))

注意:查找某人的朋友是正向,查找朋友里面有某人的人是反向查找

django--orm表自关联详解的更多相关文章

  1. django ORM 外键详解

    Django中的外键: 首先,为了方便理解,我们把使用ForeignKey的字段所在的表定义为从表,把ForeignKey中to参数连接的表称为主表. 外键使用的先决条件: 在mysql数据表中,数据 ...

  2. django orm 数据查询详解

    一 在django里面创建模型 from django.db import models class Blog(models.Model): name = models.CharField(max_l ...

  3. Django学习笔记之Django ORM Aggregation聚合详解

    在当今根据需求而不断调整而成的应用程序中,通常不仅需要能依常规的字段,如字母顺序或创建日期,来对项目进行排序,还需要按其他某种动态数据对项目进行排序.Djngo聚合就能满足这些要求. 以下面的Mode ...

  4. Django框架 之 ORM查询操作详解

    Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...

  5. ORM 对表操作 详解

    目录 ORM对表操作详解 表结构 ORM对表的 增 删 改 查 基于对象的跨表查询 -- 类似于子查询 基于双下划的跨表查询 -- 连表 join ORM对表的操作示例 正向查 与 反向查 relat ...

  6. Loadrunner手动关联详解

    Loadrunner手动关联详解 一.关联的含义: 关联(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到 ...

  7. Django框架 之 querySet详解

    Django框架 之 querySet详解 浏览目录 可切片 可迭代 惰性查询 缓存机制 exists()与iterator()方法 QuerySet 可切片 使用Python 的切片语法来限制查询集 ...

  8. django中models field详解

    本文参考自:django官方文档models/field 在model中添加字段的格式一般为:  field_name = field_type(**field_options) 一  field o ...

  9. Django url配置 正则表达式详解 分组命名匹配 命名URL 别名 和URL反向解析 命名空间模式

    Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11版本 ...

随机推荐

  1. VS2015/Visual Studio快捷键无效问题

    0 VS2015快捷键无效问题的解决办法 快捷键的使用可以大大提高编码效率,VS为我们内置了不少的常用快捷键组合,实际使用过程中往往会随着计算机上安装其他软件引起快捷键冲突,导致VS快捷键失效,解决办 ...

  2. C#高性能二进制序列化

    二进制序列化可以方便快捷的将对象进行持久化或者网络传输,并且体积小.性能高,应用面甚至还要高于json的序列化:开始之前,先来看看dotcore/dotne自带的二进制序列化:C#中对象序列化和反序列 ...

  3. .net core jwt

    https://www.cnblogs.com/JacZhu/p/6837676.html

  4. Python之Flask笔记

    在这里先说一下最开始所经历的一些错误app=Flask(_name_),当初拼写的时候怎么都报错后来发现此处是两个'_' 配置文件 app.config.from_object(__name__) 在 ...

  5. LeetCode 905. Sort Array By Parity

    905. Sort Array By Parity Given an array A of non-negative integers, return an array consisting of a ...

  6. 使用fiddlercore修改网页的返回内容

    最近研究了一下FiddlerCore,发现这是个非常强大的工具.可以用来采集网页.修改网页数据.开发页游外挂等等. 使用这个工具,需要掌握一定的html和http知识,官方网站上也有例子可以下载. 看 ...

  7. 抽象代数-p22商群

    G/e={g{e}|g∈G}={{g}|g∈G}=G G/G={gG|g∈G}={G}   (gG=G左乘g是G上的双射,它的逆映射是左乘g^-1)  所以 G/G  只有一个元素,所有G  就只能是 ...

  8. PAT L2-020 功夫传人

    https://pintia.cn/problem-sets/994805046380707840/problems/994805059118809088 一门武功能否传承久远并被发扬光大,是要看缘分 ...

  9. python自动化常见问题汇总

           1.如何提高selenium脚本的执行速度? Selenium脚本的执行速度受多方面因素的影响,如网速,操作步骤的繁琐程度,页面加载的速度,以及我们在脚本中设置的等待时间,运行脚本的线程 ...

  10. js-其他跨域技术(JSONP`Comet)

    ###1.  JSONP JSONP由两部分组成:回调函数和数据 JSONP是通过动态<script>元素来使用的,使用时可以为src属性指定一个跨域URL eg: function ha ...