django--orm表自關聯詳解


什么是表內自關聯

表內自關聯是指表內數據相關聯的對象和表是相同字段,這樣我們就直接用表內關聯將外鍵關聯設置成自身表的字段。同樣表內關聯也分一對多字段和多對多字段
例如:對於微博評論,每條評論都可能有子評論,但每條評的字段內容應該都是相同的,並且每條評論都只有一個父評論,這就滿足了,一對多的情形。父評論為關聯字段,可以對應多個子評論,這就是一對多的自關聯。

創建自關聯表(一對多情景)

在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'))

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM