python test development django-37. foreign key (a ForeignKey) Query

Foreword

Admin in front of the background page by setting the foreign key, you can select the drop-down box of options in this chapter show to explain the queries regarding foreign key (ForeignKey) of

Design models

Add a BankName on a table on the basis of, Card foreign key to the table by 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="网点", 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="详细地址", default="") class Meta: verbose_name = "账户_个人资料" verbose_name_plural = verbose_name def __str__(self): return self.card.card_user

After performing makemigrations and migrate, synchronize data

python manage.py makemigrations
python manage.py migrate

New test shell mode

In order to facilitate debugging, django shell pattern may be used, the data table CRUD operations to open cmd, cd to the directory manage.py

python manage.py shell

First add data test data

D:\web_djo\helloworld>python manage.py shell

>>> from hello.models import Card, BankName
>>> a = BankName.objects.create(bank_name='上海银行', city='上海', point='徐家汇区') >>> a.save >>> c = Card.objects.create(card_id='62270121022100000', card_user='张三', bank_info=a) >>> c.save

Forward inquiry

According card_id Card table, to query BankName information corresponding associated, this is relatively simple point

>>> 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 '上海' >>>

Reverse lookup _set

If you want to pass the name of the bank, "Bank of Shanghai," the query associated with this bank card number, and the query which information a bank card.
Reverse lookup, when ForeignKey related_name not set parameters, by default is the name of the associated table to query plus _set

  • The result is a collection of objects query QuerySet
  • () Count the number of query count function
  • [0] .card_id subscript value, obtaining the corresponding property
>>> bank = BankName.objects.get(bank_name='上海银行')
>>> bank.city
'上海'

# 反向查询,表名称_set >>> bank.card_set.all() <QuerySet [<Card: 62270121022100000>]> # count()函数统计 >>> bank.card_set.all().count() 1 >>> bank.card_set.all()[0].card_id '62270121022100000' >>>

related_name

When the foreign key table Card (ForeignKey) only one time, you can go inquiry to _set, when there are multiple foreign keys, which can not query a specific foreign keys, and this time you need to add a related_name parameters.

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="网点", 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 parameter corresponds to a foreign key to take an individual name, easy to identify when a plurality of foreign keys. Following are the new data query and forward
the ** As defined related_name "_set" related_name this type of query was replaced, so use "_set" error. **

# 新增数据
>>> 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 need to use a reverse query parameters, as follows

# 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' >>>

Guess you like

Origin www.cnblogs.com/mashuqi/p/11022063.html