一、外键跨表操作(一对多)
在 [Python自学] day-19 (2) (Django-ORM) 中,我们利用外键实现了一对多的表操作。
可以利用以下方式来获取外键指向表的数据:
def orm_test(request): # 向UserGroup表中插入一个group (gid=1,groupname='Dev') models.UserGroup.objects.create(groupname="Dev") # 向UserInfo表中插入一个user (uid=1,username='Leo',password='123',group_id=1),注意这里要使用真实列名group_id models.UserInfo.objects.create(username="Leo", password='123', group_id=1) # 联合查询UserInfo以及UserGroup # 获取第一个用户,这里只有一个用户Leo obj = models.UserInfo.objects.filter(uid=1).first() # 打印用户的用户名、密码(这些内容都在UserInfo表中) print(obj.username) print(obj.password) # 这里注意,group是外键,指向UserGroup表,所以这里的group属性是一个对象(UserGroup表的一条记录),我们通过该对象来获取groupname print(obj.group.groupname) return HttpResponse('ok')
但是,当我们在获取局部列数据的情况下:
def orm_test(request): # 因为使用了values,所以QuerySet v中的元素都是字典 # 在values()中,使用'__'来跨表操作 v = models.UserInfo.objects.filter(uid=1).values('username','group_id','group__groupname') for row in v: print(row['username']) print(row['group_id']) # 使用key来获取字典中的值,如果是通过render返回给模板,则模板语言也要使用v.group__groupname来获取值 print(row['group__groupname']) return HttpResponse('ok')
以上规则同样适合于使用values_list()的情况,只不过将QuerySet内部元素变成元组而已。values_list()中跨表也使用"__"。