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


前言

前面一篇在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)

此時頁面顯示效果如下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM