1. 程式人生 > >django 表的一對多關係建立和主從表相互查詢

django 表的一對多關係建立和主從表相互查詢

在modes中建立類,如下:

from django.db import models


# Create your models here.
#構建team表,作為主表
class Team(models.Model):
    #建立名字屬性
    tname = models.CharField(max_length=20)
    #重寫__str__方法,方便觀看結果
    def __str__(self):
        return self.tname
    #定義表名
    class Meta:
        db_table = 'team'
#構建group1表,作為主表
class Group1(models.Model):
    gname = models.CharField(max_length=20)
    #多對一模型通過ForeignKey表示多對一
    # 外來鍵設定為DO_NOTHING,從表中有記錄依賴主表記錄,則主表記錄不允許刪除
    team = models.ForeignKey(Team,on_delete=models.DO_NOTHING)

    def __str__(self):
        return self.gname

    class Meta:
        db_table = 'group1'
正向查詢,主表查從表,如下:
def get_group_by_team(request):
    #得到Team中的一個物件
    team = Team.objects.get(pk=3)
    #得到team對應group1表中的資料
    print(team.group1_set.all())
    return HttpResponse(123)

總結:基本語法為:

主表物件.從表小寫_set.過濾器方法
反向查詢,從表查主表
def get_team_by_group(request):
    #得到Group1中的一個物件
    g1 = Group1.objects.last()
    # 一個組對應一個班級,可以通過team直接獲取班級資訊
    print(g1.team.tname)
    return HttpResponse("通過組獲取班級資訊")

總結:基本語法為:

  從表物件.主表類名小寫.屬性(若要獲取特定屬性)

跨關係查詢
# 跨關係查詢
def lookup1(request):
    # 從表查主表
    team = Team.objects.filter(group1__id__exact=5)

    #主表查從表
    g1 = Group1.objects.filter(team__tname='1802')

    return HttpResponse("跨關係查詢")

總結:基本語法為:

從表查主表:從表類名.objects.過濾器(主表類名小寫__屬性__比較符='*******')

主表查從表:主表類名.objects.過濾器(從表類名小寫__屬性__比較符='*******')