[Python自学] day-20 ()

一、外键跨表操作(一对多)

在 [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()中跨表也使用"__"。

猜你喜欢

转载自www.cnblogs.com/leokale-zz/p/12064076.html
今日推荐