python测试开发django-36.OneToOneField关系查询

前言

前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示。本篇继续学习一对一(OneToOneField)关系的查询。
上一篇list_display只显示了当前表的字段信息,如果想显示关联表的字段,需要关联查询。

一对一(OneToOneField)关系

接着前面的一篇python测试开发django-35.xadmin注册表信息,先设计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)

此时页面显示效果如下

2019年《python3接口自动化》课程3月17-4月14开课

主讲老师:上海-悠悠

上课方式:QQ群视频在线教学

上课时间:每周六、周日晚上20:30-22:30

报名费:1000

(0)

相关推荐

  • Django的开发流程与数据库设计

    引言:项目开发流程: 需求分析(成员:架构师 .产品经理 .开发者组长) 在跟客户谈需求之前,会大致先了解客户的需求,然后自己先设计一套比较好写的方案.跟客户沟通交流中引导客户往我们之前想好的方案上面 ...

  • python测试开发django-37.外键(ForeignKey)查询

    前言 前面在admin后台页面通过设置外键,可以选择下拉框的选项,本篇主要讲解关于外键(ForeignKey)的查询 models设计 在上一篇的基础上新增一个BankName表,Card表通过外键关 ...

  • python测试开发django-75.ORM根据日期查询(__range)

    前言 在使用django的 ORM 查询时候,我想查询最近3天的数据,需根据日期查询某一段时间的数据 时间筛选方式 可以根据 year.month.day.week_day 查询对应时间的记录 比如我 ...

  • python测试开发django -140.Bootstrap 缩略图

    前言 网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 class .thumbnail 的& ...

  • python测试开发django -143.Bootstrap 表单控件校验状态

    前言 Bootstrap 对表单控件的校验状态,如 error.warning 和 success 状态,都定义了样式.使用时,添加 .has-warning..has-error 或 .has-su ...

  • python测试开发django -142.Bootstrap 表单(form)

    前言 HTML 表单用于收集不同类型的用户输入.boostrap中表单有几种样式 基本垂直表单 内联表单 form-inline 水平排列表单 form-horizontal 基本表单实例 单独的表单 ...

  • python测试开发django -141.Bootstrap 面板(Panels)

    # 前言 面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 元素添加 class .panel 和 class .panel-default 即可 基础面板 不带标题的基本面 ...

  • python测试开发django -144.Ace Editor 在线编辑python代码

    前言 网页上想在线编辑代码,可以使用Ace Editor 在线编辑实现.比如我们想实现一个功能,在网页版上写python代码,能有python的语法自动补齐功能. Ace Editor 在线编辑 AC ...

  • python测试开发django-10.django连接mysql

    前言 Django 对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle.本篇以mysql为例简单介绍django连接mysql进行数据操作 Django连 ...

  • python测试开发django-31.admin后台一对多关系

    前言 平常的网页上有很多一对多的场景,比如填写银行卡信息的时候,会从银行列表下拉框选择对应的银行信息.一般会建两张表,一张表放银行的信息,一张表放银行卡信息. 每个银行可以对应多个银行卡,每个银行卡只 ...