python測試開發django-36.一對一(OneToOneField)關係查詢

前言

前面一篇在xadmin後臺一個頁面顯示2個關聯表(OneToOneField)的字段,使用inlines內聯顯示。本篇繼續學習一對一(OneToOneField)關係的查詢。
上一篇list_display只顯示了當前表的字段信息,若是想顯示關聯表的字段,須要關聯查詢。html

一對一(OneToOneField)關係

接着前面的一篇python測試開發django-33.admin後臺一對一關係OneToOneField,先設計Card和CarDetail表python

# models.py from django.db import models # Create your models here. 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="添加時間") class Meta: verbose_name_plural = '銀行卡帳戶' verbose_name = "銀行卡帳戶_基本信息" 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_plural = '我的資料' verbose_name = "帳戶_我的資料" def __str__(self): return self.card.card_user

shell模式新增數據

爲了調試方便,能夠使用django的shell模式,對錶的數據增刪改查操做,打開cmd,cd到manage.py目錄shell

python manage.py shelldjango

先在Card表新增一條記錄:card_id='900100200300400500', card_user='喬峯'ruby

>>> from hello.models import Card,CardDetail >>> c = Card.objects.create(card_id='900100200300400501', card_user='喬峯') >>> c.save <bound method Model.save of <Card: 900100200300400501>> >>>

接着在CardDetail表新增一條關聯的信息函數

>>> d = CardDetail.objects.create(card=c, tel='1500012332',mail='12345678@qq.com', city='上海',address='張江高科') >>> d.save <bound method Model.save of <CardDetail: 喬峯>> >>> 

正向查詢

接着上面的操做,查詢Card表的card_id和card_user字段值學習

>>> c.card_id '900100200300400501' >>> c.card_user '喬峯'

經過Card表對象c查詢關聯的CardDetail表裏面的字段值測試

>>> c.carddetail.tel '1500012332' >>> c.carddetail.mail '12345678@qq.com'

反向查詢

若是是以CardDetail表爲操做對象,能夠直接查詢CardDetail表裏面的字段值spa

>>> d.tel '1500012332' >>> d.city

也能夠經過CardDetail表爲對象,查詢關聯的Card表的值設計

>>> d.card.card_id '900100200300400501' >>> d.card.card_user '喬峯'

list_display顯示關聯表字段

在上一篇【python測試開發django-35.xadmin註冊表信息】經過內聯(inlines)能夠在詳情頁面顯示關聯的表信息

若是咱們想讓關聯表的字段顯示在list_display列表界面,這裏就須要本身定義函數,經過表的關聯去查詢了

# adminx.py import xadmin from .models import Card, CardDetail class ControlStudent(object): # 顯示的字段 list_display = ('student_id', 'name', 'age', 'score') # 搜索條件 search_fields = ('name',) # 每頁顯示10條 list_per_page = 10 class MoreInfo(object): model = CardDetail class ControlCard(object): list_display = ["card_id", "card_user", "電話", "城市", "add_time"] # 在Card頁面顯示更多信息CardDetail inlines = [MoreInfo] # 查詢關聯表的tel字段 def 電話(self, obj): return obj.carddetail.tel def 城市(self, obj): return obj.carddetail.city # 註冊card表,關聯CardDetail xadmin.site.register(Card, ControlCard)

此時頁面顯示效果以下

相關文章
相關標籤/搜索