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