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