前言

前面一篇在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)关系查询的更多相关文章

  1. python测试开发django-16.JsonResponse返回中文编码问题

    前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...

  2. python测试开发django-15.查询结果转json(serializers)

    前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...

  3. 2019第一期《python测试开发》课程,10月13号开学

    2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...

  4. python测试开发django-rest-framework-63.基于函数的视图(@api_view())

    前言 上一篇讲了基于类的视图,在REST framework中,你也可以使用常规的基于函数的视图.它提供了一组简单的装饰器,用来包装你的视图函数, 以确保视图函数会收到Request(而不是Djang ...

  5. 《Python测试开发技术栈—巴哥职场进化记》—前言

    写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...

  6. python测试开发django-197.django-celery-beat 定时任务

    前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...

  7. python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)

    前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...

  8. 【python测试开发栈】python基础语法大盘点

    周边很多同学在用python,但是偶尔会发现有人对python的基础语法还不是特别了解,所以帮大家梳理了python的基础语法(文中的介绍以python3为例).如果你已然是python大牛,可以跳过 ...

  9. python web开发——django学习(一)第一个连接mysql数据库django网站运行成功

    1.新建一个项目 2.新建一些文件夹方便管理 3.新建一个项目叫message  4.连接数据库 python web开发Django连接mysql 5.在数据库里自动生成django的表  6.运行 ...

随机推荐

  1. javascript设计模式----桥接模式、组合模式、装饰者模式、享元模式

    http://blog.csdn.net/painsonline/article/details/7215087    桥接模式:http://www.cnblogs.com/TomXu/archiv ...

  2. FormData介绍

    FormData XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以 ...

  3. PHP实现 APP端微信支付功能

    1.我封装好的一个支付类文件,多余的东西都去除掉了,并且把配置参数放到了这个支付类中,只需要修改Weixinpayandroid方法内的几个参数就可以直接复制使用: class Wxpayandroi ...

  4. Java编程的逻辑 (52) - 抽象容器类

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...

  5. Java第三阶段学习(十、XML学习)

    一.XML学习 1.模拟Servlet执行 在学习完前端及java与数据库后,将进行WEB编程阶段的学习.在WEB编程中,可以通过浏览器访问WEB服务器上的数据.这时WEB服务器就相当于另一台计算机. ...

  6. Codeforces Round #530 (Div. 2) F - Cookies

    F - Cookies 思路:我们先考虑如何算出在每个节点结束最多能吃多少饼干, 这个dfs的时候用线段树维护一下就好了, 然后有个这个信息之后树上小dp一下就好啦. #include<bits ...

  7. 001.Git简介与安装

    一 git介绍 1.1 概述 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放 ...

  8. Eclipse中从svn中检出maven项目

    相信很多初学者都遇到过Eclipse中从SVN检出Maven项目之后看到的目录结构并不是Maven目录结构:或者只能先用SVN将Maven项目签入到本地,然后再用Eclipse导入Maven项目,但是 ...

  9. mysql的checkpoint

    上一章的结尾我们留下了一个问题,就是在上一章所介绍的模型中,恢复管理器必须要通过全篇扫描整个undolog进行日志恢复,这样做显然是没有太大必要的,因为系统中断肯定是在最后几个事务受到影响,前面的事务 ...

  10. activiti流程

    package cn.demo.service.impl; import java.io.File; import java.io.FileInputStream; import java.io.Fi ...