前言

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

此时页面显示效果如下

最新文章

  1. div+css页面右侧底部悬浮层
  2. 把VSO作为GitHub上JavaScript项目的免费CI服务器
  3. P,NP,NPC,NPC-HARD
  4. ios开发@selector的函数如何传参数/如何传递多个参数
  5. cglib源码分析(四):cglib 动态代理原理分析
  6. hadoop错误FATAL org.apache.hadoop.hdfs.server.namenode.NameNode Exception in namenode join java.io.IOException There appears to be a gap in the edit log
  7. 如何在DJANGO里,向有外键(一对多和多对多)的DB里插入数据?
  8. java常量设置的方式
  9. 悬浮二维码 QQ ToTop
  10. 201521123009 《Java程序设计》第1周学习总结
  11. 【翻译】Ext JS 6早期访问版本发布
  12. Tomcat系列(7)——Tomcat类加载机制
  13. nginx.conf 中php-ftp配置
  14. postgre索引
  15. mysql error
  16. spring整合kafka(配置文件方式 消费者)
  17. Android热修复之AndFix使用教程
  18. [arc068E]Snuke Line-[树状数组]
  19. $微信小程序开发实践点滴——Bmob常用API的使用
  20. python 对比学习

热门文章

  1. java 异常 throw
  2. FreeMarker使用小记(HelloWorld)
  3. 2016 版 Laravel 系列入门教程
  4. [转] javascript组件开发方式
  5. lrzsz安装
  6. 【LOJ】#2510. 「AHOI / HNOI2018」道路
  7. Linux下jdk、Tomcat、MySQL的安装
  8. P1091 合唱队形 DP 最长升序列维护
  9. 【Java】 大话数据结构(5) 线性表之双向链表
  10. js 高阶函数(map/reduce/filter/sort)