前言
前面一篇在xadmin后台一個頁面顯示2個關聯表(OneToOneField)的字段,使用inlines內聯顯示。本篇繼續學習一對一(OneToOneField)關系的查詢。
上一篇list_display只顯示了當前表的字段信息,如果想顯示關聯表的字段,需要關聯查詢。
一對一(OneToOneField)關系
接着前面的一篇python測試開發django-33.admin后台一對一關系OneToOneField,先設計Card和CarDetail表
# 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目錄
python manage.py shell
先在Card表新增一條記錄:card_id='900100200300400500', card_user='喬峰'
>>> 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表里面的字段值
>>> 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)
此時頁面顯示效果如下