什么是表内自关联?Django ORM 如何创建自关联表?

2022-10-0307:46:11后端程序开发Comments638 views字数 1610阅读模式

什么是表内自关联

表内自关联是指表内数据相关联的对象和表是相同字段,这样我们就直接用表内关联将外键关联设置成自身表的字段。同样表内关联也分一对多字段和多对多字段文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/28162.html

例如:对于微博评论,每条评论都可能有子评论,但每条评的字段内容应该都是相同的,并且每条评论都只有一个父评论,这就满足了,一对多的情形。父评论为关联字段,可以对应多个子评论,这就是一对多的自关联。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/28162.html

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

在django项目的models中创建评论表。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/28162.html

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

添加数据,第一条数据关联字段为空,说明是父评论,第二条数据关联了第一条数据说明是第一条数据的字评论,同样后两条数据是是第二条数据的子评论文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/28162.html

什么是表内自关联?Django ORM 如何创建自关联表?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/28162.html

接下来查找第一条数据的子评论:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/28162.html

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

注意:外键关联是在子评论中,有关联字段的是子评论,子评论查父评论是正向,父评论查子评论是反向。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/28162.html

多对多表自关联

建立一张表,表字段为姓名以及朋友多对多字段,一个人可有多个朋友,也可以是多个人的朋友,找一个人的朋友是正向查找,找是某个人的朋友是反向查找。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/28162.html

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

添加数据:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/28162.html

什么是表内自关联?Django ORM 如何创建自关联表?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/28162.html

什么是表内自关联?Django ORM 如何创建自关联表?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/28162.html

  1. # 查找沁阳的基友
  2. #正向查找关联字段__name
  3. print(Person.objects.filter(name='沁阳').values('friends__name'))
  4. # 反向查找沁阳的基友
  5. # print(Person.objects.all().filter(ship__name='沁阳'))
  6. # 查找王帅的基友
  7. # 正向查找关联字段__name,王帅是沁阳的朋友但王帅的朋友是空,因为王帅没有关联别人
  8. print(Person.objects.get(name='王帅').friends.all())
  9. #反向查找是王帅朋友的人,也是空
  10. print(Person.objects.filter(ship__name='王帅'))
  11. # 基友是沁阳的那个人反向查找
  12. print(Person.objects.get(name='沁阳').ship.all())
  13. #基友是王帅的那个人反向查找
  14. # print(Person.objects.get(name='王帅').ship.all())
  15. # 基友含有沁阳的人反向
  16. print(Person.objects.filter(name='沁阳').values('ship__name'))

注意:查找某人的朋友是正向,查找朋友里面有某人的人是反向查找文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/28162.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/28162.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定