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