Django中基于双下划线的跨表查询

django跨表查询一般有两种。

1 基于对象的跨表查询方式,常用的是符号

基于对象的跨表查询也分正向查询和反向查询。由主表从表就是反向,由从表主表就是正向。一般来说外建放在那个表中,哪个表就是从表。

例如:

class UserInfo(models.Model):
    username=models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    address = models.CharField(max_length=32)


class UserDetail(models.Model):
    boyfiend_name = models.CharField(max_length=32)
    phonenum = models.CharField(max_length = 11)
    user = models.ForeignKey(UserInfo,related_ name='uuu')

注意:无论是正向查询还是反向查询,首先记住这种查询方式是基于对象的查询。因此第一必须是对象。get()或者first(),last()等获得的是单个对象。

正向查询:UserDetail(从表) --> UserInfo (主表) 

UserDetail.objects.get(id=1).user.all()

UserDetail.objects.get(id=1).user.username

UserDetail.objects.get(id=1).user.pwd

反向查询: UserInfo (主表) --> UserDetail(从表)

UserInfo.objects.get(id=1).uuu.all()

# 注意反向操作的时候,由于查询出的可能是一个QuerySet。因此不可以在最后直接点.字段名。

UserInfo.objects.get(id=1).uuu.all()[0].order_content

UserInfo.objects.filter(id=1).first().uuu.all()[0].order_content

此外,设置了related_name后,基于对象的反向查询,related_name   ==   表名_set

如果user外建没设置related_name的话

UserInfo.objects.get(id=1).userdetail_set.all()[0].order_content

 

2 基于双下划线的跨表查询。

基于双下划线的跨表查询也分为正向查询和反向查询。

正向查询

这里面的正向查询表示:查询条件字段或者查询字段在主表中。由从表查主表

# 查询条件字段在主表中,最终查询字段值还是在从表中。

UserDetail.objects.filter(user__pwd=123).values()

# 查询字段值在主表中,查询条件字段在从表中。

UserDetail.objects.filter(phonenum=110).values('user__pwd')

反向查询

这里的反向查询表示:查询条件字段或者查询字段值在从表中,由主表查从表。

# 查询条件字段在从表中。

UserInfo.objects.filter(uuu__phonenum=110).values()

# 查询字段值在从表中。

UserInfo.objects.filter(username='xiao').values('uuu__phonenum')

注意:在反向查询中,优先级顺序:related_query_name > related_name > 表名

即:当related_query_name和related_name同时出现时,related_query_name或覆盖related_name,你再使用related_name会报错。当related_name出现时,而related_query_name未出现。你必须使用related_name,此时在使用表名的话会报错。

在反向查询时,在没有设置related_name的时候,基于双下划线只需使用表名,而基于对象的查询方式需要使用表名_set

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值