• 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)

    此时页面显示效果如下

  • 相关阅读:
    网络编程(二)——TCP协议、基于tcp协议的套接字socket
    网络编程(一)——网络编程介绍
    吴裕雄--天生自然JAVA开发JSP-Servlet学习笔记:指定JSP页面的错误提示页
    吴裕雄--天生自然JAVA开发JSP-Servlet学习笔记:指定JSP页面的描述信息
    吴裕雄--天生自然JAVA开发JSP-Servlet学习笔记:JSP脚本
    吴裕雄--天生自然JAVA开发JSP-Servlet学习笔记:输出JSP表达式
    吴裕雄--天生自然JAVA开发JSP-Servlet学习笔记:JSP声明
    吴裕雄--天生自然JAVA开发JSP-Servlet学习笔记:JSP的基本原理
    吴裕雄--天生自然JAVA开发JSP-Servlet学习笔记:构建WEB应用
    吴裕雄--天生自然 JAVA-ORACLE学习笔记:JAVA连接ORACLE操作
  • 原文地址:https://www.cnblogs.com/mashuqi/p/11010293.html
Copyright © 2020-2023  润新知