前言前面在admin后臺頁面通過設(shè)置外鍵,可以選擇下拉框的選項,,本篇主要講解關(guān)于外鍵(ForeignKey)的查詢 models設(shè)計在上一篇的基礎(chǔ)上新增一個BankName表,,Card表通過外鍵關(guān)聯(lián)到BankName class BankName(models.Model): '''銀行信息''' bank_name = models.CharField(max_length=50, verbose_name="銀行名稱", default="") city = models.CharField(max_length=30, verbose_name="城市", default="") point = models.CharField(max_length=60, verbose_name="網(wǎng)點", default="")
class Meta: verbose_name = '銀行' verbose_name_plural = verbose_name
def __str__(self): return self.bank_name
class Card(models.Model): '''銀行卡 基本信息''' card_id = models.CharField(max_length=30, verbose_name="卡號", default="") card_user = models.CharField(max_length=10, verbose_name="姓名", default="") add_time = models.DateField(auto_now=True, verbose_name="添加時間") bank_info = models.ForeignKey(BankName, on_delete=models.CASCADE, default="")
class Meta: verbose_name = "銀行卡賬戶_基本信息" verbose_name_plural = '銀行卡賬戶'
def __str__(self): return self.card_id
class CardDetail(models.Model): '''銀行卡詳情信息''' card = models.OneToOneField(Card, on_delete=models.CASCADE, verbose_name="卡號" ) tel = models.CharField(max_length=30, verbose_name="電話", default="") mail = models.CharField(max_length=30, verbose_name="郵箱", default="") city = models.CharField(max_length=10, verbose_name="城市", default="") address = models.CharField(max_length=30, verbose_name="詳細(xì)地址", default="")
class Meta: verbose_name = "賬戶_個人資料" verbose_name_plural = verbose_name
def __str__(self): return self.card.card_user 之后執(zhí)行 makemigrations 和migrate,,同步數(shù)據(jù) python manage.py makemigrations python manage.py migrate
shell模式新增測試為了調(diào)試方便,,可以使用django的shell模式,,對表的數(shù)據(jù)增刪改查操作,,打開cmd,,cd到manage.py目錄 python manage.py shell
先新增數(shù)據(jù)測試數(shù)據(jù) D:\web_djo\helloworld>python manage.py shell
>>> from hello.models import Card, BankName >>> a = BankName.objects.create(bank_name='上海銀行', city='上海', point='徐家匯區(qū)') >>> c = Card.objects.create(card_id='62270121022100000', card_user='張三', bank_info=a) 正向查詢根據(jù)Card表的card_id,去查詢關(guān)聯(lián)的對應(yīng)的BankName相關(guān)信息,,這個相對來說簡單一點 >>> from hello.models import BankName, Card >>> cardxx=Card.objects.get(card_id='62270121022100000') >>> cardxx.card_user '張三'
>>> cardxx.bank_info <BankName: 上海銀行>
>>> cardxx.bank_info.bank_name '上海銀行' >>> cardxx.bank_info.city '上海' >>> 反向查詢_set如果想通過銀行名稱“上海銀行”,,查詢到此銀行關(guān)聯(lián)多少張卡,并且查詢其中一個銀行卡的信息,。 反向查詢,,當(dāng)ForeignKey沒設(shè)置related_name參數(shù),默認(rèn)是通過關(guān)聯(lián)表的名稱加_set去查詢 >>> bank = BankName.objects.get(bank_name='上海銀行') >>> bank.city '上海'
# 反向查詢,,表名稱_set >>> bank.card_set.all() <QuerySet [<Card: 62270121022100000>]>
# count()函數(shù)統(tǒng)計 >>> bank.card_set.all().count() 1
>>> bank.card_set.all()[0].card_id '62270121022100000' >>> related_name當(dāng)Card表的外鍵(ForeignKey)只有一個時,可以通過_set去查詢到,,當(dāng)有多個外鍵時,,就無法查詢具體哪個外鍵了,這時候就需要加個related_name參數(shù)。 class CardGrade(models.Model): '''會員等級''' nub = models.CharField(max_length=50, verbose_name="會員等級", default="")
class Meta: verbose_name = '會員等級' verbose_name_plural = verbose_name
class BankName(models.Model): '''銀行信息''' bank_name = models.CharField(max_length=50, verbose_name="銀行名稱", default="") city = models.CharField(max_length=30, verbose_name="城市", default="") point = models.CharField(max_length=60, verbose_name="網(wǎng)點", default="")
class Meta: verbose_name = '銀行' verbose_name_plural = verbose_name
def __str__(self): return self.bank_name
class Card(models.Model): '''銀行卡 基本信息''' card_id = models.CharField(max_length=30, verbose_name="卡號", default="") card_user = models.CharField(max_length=10, verbose_name="姓名", default="") add_time = models.DateField(auto_now=True, verbose_name="添加時間") bank_info = models.ForeignKey(BankName, related_name='card_bank', on_delete=models.CASCADE, default="") grade = models.ForeignKey(CardGrade, related_name='card_grade', on_delete=models.CASCADE, default="")
class Meta: verbose_name = "銀行卡賬戶_基本信息" verbose_name_plural = '銀行卡賬戶'
def __str__(self): return self.card_id related_name參數(shù)相當(dāng)于給這個外鍵取了個別名,,方便多個外鍵時候去識別,。以下是新增數(shù)據(jù)和正向查詢 # 新增數(shù)據(jù) >>> from hello.models import CardGrade,BankName,Card >>> n=CardGrade.objects.create(nub='黃金會員') >>> b=BankName.objects.create(bank_name='北京銀行',city='北京') >>> c=Card.objects.create(card_id='666555000111',card_user='楊過', bank_info=b, grade=n)
# 正向查詢 >>> c.grade.nub '黃金會員'
>>> c.bank_info.city '北京' >>> 反向查詢需要用到related_name參數(shù),如下 # CardGrade表查Card表 >>> nnn=CardGrade.objects.get(nub='黃金會員') >>> nnn.card_grade.all() <QuerySet [<Card: 666555000111>]> >>> nnn.card_grade.all()[0].card_id '666555000111'
# BankName表查Card表 >>> bbb=BankName.objects.get(bank_name='上海銀行') >>> bbb.card_bank.all() <QuerySet [<Card: 62270121022100000>]> >>> bbb.card_bank.all()[0].card_id '62270121022100000' >>> 2019年《python3接口自動化》課程3月17-4月14開課 主講老師:上海-悠悠 上課方式:QQ群視頻在線教學(xué) 上課時間:每周六,、周日晚上20:30-22:30 報名費:1000
|