Django默认ORM(四):一对多(O2M)外键操作

Django ORM 外键关联操作
本文介绍 Django ORM 中的外键关联表操作方法,包括正向和反向操作的具体实现方式,以及如何使用 values() 和 values_list() 获取数据,并通过实际案例展示了跨表查询的技巧。

外键关联表操作:正反向操作

比如说:有虾面这俩表,填充一些数据

    from django.db import models

    class UserType(models.Model):
        """
        用户类型
        """
        title = models.CharField(max_length=32)

    class UserInfo(models.Model):
        """
        用户表
        """
        name = models.CharField(max_length=16)
        age = models.IntegerField()
        ut = models.ForeignKey('UserType')


外键关联表操作:正反向操作

    # UserInfo,如果这个表中有外键,ut是外键FK字段 - 那么正向操作
    # obj = models.UserInfo.objects.all().first()
    # 取本表字段:obj.name;obj.age
    # 取外键关联表字段:obj.ut.title

    # UserType, 表名小写_set.all()  - 反向操作
    # obj = models.UserType.objects.all().first()
    # 取本表字段:obj.id,obj.title
    # 根据本表取UserInfo字段:
      for row in obj.userinfo_set.all():
    #     print(row.name,row.age)

    # result = models.UserType.objects.all()
    # for item in result:
    #     print(item.title,item.userinfo_set.filter(name='xx'))

  

values()与values_list() 返回本表数据的字典格式和元组格式

注意 :values()  取出来的是字典格式;values_list() 取出来的是元组格式
    # result = models.UserInfo.objects.all().values('id','name')
    # QuerySet[{'id':'xx','name':'xx'} ]
    # for row in result:
    #     print(row)

    # result = models.UserInfo.objects.all().values_list('id','name')
    # QuerySet[(1,'f'), ]
    # for row in result:
    #     print(row)

    # 数据获取多个数据时
    # 1. [obj,obj,obj,]
    # models.UserInfo.objects.all()
    # models.UserInfo.objects.filter(id__gt=1)
    # result = models.UserInfo.objects.all()
    # for item in result:
    #     print(item.name,item.ut.title)

    # 2. [{id:1,name:fd},{id:1,name:fd},{id:1,name:fd},]
    # models.UserInfo.objects.all().values('id','name')
    # models.UserInfo.objects.filter(id__gt=1).values('id','name')

  

跨表返回更加丰富数据的字典和元组格式

    # 不跨表只能取自己表数据
    # result = models.UserInfo.objects.all().values('id','name')
    # for item in result:
    #     print(item['id'],item['name'])

    # 利用神奇的__,跨表取字段返回一个包含表内字段的字典
    # result = models.UserInfo.objects.all().values('id','name',"ut__title")
    # for item in result:
    #     print(item['id'],item['name'],item['ut__title'])


    # 3. [(1,df),(2,'df')]
    # models.UserInfo.objects.all().values_list('id','name')
    # models.UserInfo.objects.filter(id__gt=1).values_list('id','name')
    # 不跨表只能取自己表数据
    # result = models.UserInfo.objects.all().values_list('id','name')
    # for item in result:
    #     print(item[0],item[1])

    # 利用神奇的__,跨表取字段返回一个包含表内字段的字典
    # result = models.UserInfo.objects.all().values_list('id','name',"ut__title")
    # for item in result:
    #     print(item[0],item[1],item[2])

  

 

转载于:https://www.cnblogs.com/adamans/articles/7575332.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值