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)
此时页面显示效果如下

python测试开发django-36.一对一(OneToOneField)关系查询的更多相关文章
- python测试开发django-16.JsonResponse返回中文编码问题
前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...
- python测试开发django-15.查询结果转json(serializers)
前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...
- 2019第一期《python测试开发》课程,10月13号开学
2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...
- python测试开发django-rest-framework-63.基于函数的视图(@api_view())
前言 上一篇讲了基于类的视图,在REST framework中,你也可以使用常规的基于函数的视图.它提供了一组简单的装饰器,用来包装你的视图函数, 以确保视图函数会收到Request(而不是Djang ...
- 《Python测试开发技术栈—巴哥职场进化记》—前言
写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...
- python测试开发django-197.django-celery-beat 定时任务
前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...
- python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)
前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...
- 【python测试开发栈】python基础语法大盘点
周边很多同学在用python,但是偶尔会发现有人对python的基础语法还不是特别了解,所以帮大家梳理了python的基础语法(文中的介绍以python3为例).如果你已然是python大牛,可以跳过 ...
- python web开发——django学习(一)第一个连接mysql数据库django网站运行成功
1.新建一个项目 2.新建一些文件夹方便管理 3.新建一个项目叫message 4.连接数据库 python web开发Django连接mysql 5.在数据库里自动生成django的表 6.运行 ...
随机推荐
- [转] caffe数据层参数说明
原文地址:http://www.cnblogs.com/denny402/p/5070928.html 稍有修改: 数据层是每个模型的最底层,是模型的入口,不仅提供数据的输入,也提供数据从Blobs转 ...
- ruby on rails在fedora18上install
ruby on rails 在fedora18下的安装 天朝的网络原因,安装不是很顺畅,所以把过程记录下备用 前面下载rubygem什么的都比较快,新建一个project的时候会出问题 gem new ...
- .NetCore WebApi利用Swagger文档实现选择文件上传
介绍 实现这个功能主要还是依赖过滤器 在Swagger中利用 IOperationFilter 操作来实现文件上传 与之前处理结合Idr4授权一样的处理方式,不同的是授权处理的是Security,而文 ...
- fstab文件详解
挂载分区的位置 挂载点 分区格式 设置 备份自检 UUID=94e4e... / ext4 defaults,barrier=0 1 1 tmpfs /dev/shm tmpfs defaults 0 ...
- bzoj 1151: [CTSC2007]动物园zoo
思路:因为每个人最多只能看到五个动物,我们考虑将其状压,f[ i ][ s ] 表示到了第 i 个位置, i, i + 1, i + 2, i + 3, i + 4这四个动物的状态为s, 此时的最大值 ...
- 032 Spark容错特性
1.spark容错主要分为两个方面 其一是集群 再者为spark的应用程序. 2.Driver 重要补充: driver宕机: Spark On Yarn:总之,要重启 client:只能重启job ...
- Ubuntu系统无法获得锁/var/lib/dpkg/lock - open (11: 资源暂时不可用)的解决方案
Ubuntu系统无法获得锁/var/lib/dpkg/lock - open (11: 资源暂时不可用)的解决方案 问题 使用Ubuntu打开终端时,输入带有sudo apt-get 命令行是 ...
- redis 持久化的两种方式
一:快照模式 或许在用Redis之初的时候,就听说过redis有两种持久化模式,第一种是SNAPSHOTTING模式,还是一种是AOF模式,而且在实战场景下用的最多的 莫过于SNAPSHOTTING模 ...
- 003.NFS配置实例
一 NFS常见服务管理 1.1 启动NFS [root@imxhy ~]# systemctl start nfs #CentOS7.x系列启动 [root@imxhy ~]# service nfs ...
- error 1044 (42000):access denied for user ''@'localhost' to database 'quickapp' 解决方法
在虚拟机上重新创建一个数据库时,一直出现这个报错:error 1044 (42000):access denied for user ''@'localhost' to database 'quick ...