ORM的跨表操作

在Django的ORM中可以不通过SQL语句直接根据当前表的外键调用对应的另一个表中的数据,根据拥有外键表的外键得到相关联表的数据的操作称为正向跨表

通过ORM建立的两张表 ug是UserInfo的外键,在UserInfo表中显示时会默认把ug变成ug_id存放,而ug则用来存放关联表的数据

class UserGroup(models.Model):
    title = models.CharField(max_length=32)

class UserInfo(models.Model):
    nid = models.BigAutoField(primary_key=True)
    user = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField(default=1)
    ug = models.ForeignKey("UserGroup",null=True,on_delete=models.CASCADE)

#.1UserInfo.objects.all()得到的数据是以对象类型存放在列表中的所以取值时要用对象.的方法,q[0]是表中的第一行数据的对象,UserInfo中每一行关联的外键表的信息都存放在ug里

#.2UserInfo.objects.values()得到的数据是将表中每一行数据以字典的形式存放在一个列表中,ug__title是得到外键对应表中title的值

#.3UserInfo.objects.values_list()得到的数据是将表中每一行数据以元组的形式存放在一个列表中

#.1
q = UserInfo.objects.all()
q[0].ug.title

#.2
q = UserInfo.objects.values('nid','ug_id','ug__title')    #通过外键.双下划线+名称得到关联表中的数据
q[0]['ug__title']

#.3
q = UserInfo.objects.values_list('nid','ug_id','ug__title')
q[0][2]

根据相关联表得到拥有外键表的数据的操作称为反向跨表

#.1得到对象类型的数据通过.拥有外键的表的小写名称_set得到数据

#.2#.3通过在括号里写上拥有外键的表的小写名称__对应列的名称得到数据

#.1
obj = UserGroup.objects.all().first()
result = obj.userinfo_set.all()

#.2
v = UserGroup.objects.values('userinfo__age')

#.3
v = UserGroup.objects.values_list('userinfo__age')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在SQLAlchemy中,跨表查询可以使用join()函数实现。假设我们有两个表,一个是User,一个是Order,它们之间存在外键关系,我们要查询所有用户及其关联的订单信息,可以按以下步骤进行操作: 1. 定义表结构 ```python from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) orders = relationship("Order", back_populates="user") class Order(Base): __tablename__ = 'orders' id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('users.id')) amount = Column(Integer) user = relationship("User", back_populates="orders") ``` 2. 创建Session并查询数据 ```python from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker engine = create_engine('sqlite:///example.db') Session = sessionmaker(bind=engine) session = Session() # 使用join查询所有用户及其关联的订单信息 query = session.query(User, Order).join(Order) # 打印查询结果 for user, order in query.all(): print(f"User: {user.name}, Order: {order.amount}") ``` 在这个例子中,我们使用join()函数将User表和Order表连接起来,并且通过relationship定义了表之间的关系。在查询时,我们使用session.query()函数查询所有用户及其关联的订单信息,并通过join()函数将两个表连接起来。最后,我们通过for循环遍历查询结果并打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值