上海python一对一_python测试开发django-36.一对一(OneToOneField)关系查询

前言

前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示。本篇继续学习一对一(OneToOneField)关系的查询。

上一篇list_display只显示了当前表的字段信息,如果想显示关联表的字段,需要关联查询。

一对一(OneToOneField)关系

# 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

>

>>>

接着在CardDetail表新增一条关联的信息

>>> d = CardDetail.objects.create(card=c, tel='1500012332',mail='12345678@qq.com', city='上海',address='张江高科')

>>> d.save

>

>>>

正向查询

接着上面的操作,查询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显示关联表字段

如果我们想让关联表的字段显示在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)

此时页面显示效果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值