django模型的连表查询

在数据库当中,可以通过设置外键的方式将两个表进行连接,如果需要查询数据的时候就需要进行连表查询。

例如:假如我现在有两张表。userinfo 和 usertype,userinfo里面记录了用户的信息,usertype表里面记录了用户的角色。
两个表是通过外键进行关联。

usertype model

class usertype(models.Model):
    name = models.Charfield(max_length=50)

userinfo model

class userinfo(models.Model):
    username = models.Charfield(max_length=50)
    password = models.Charfield(max_length=50)
    email = models.EmailField()
    # 外键关联
    user_type = models.Foreignkey('usertype')

我们想要获取数据有三种方法,

第一种是:get(获取单条数据,需要指定条件,例如id=xx)

例如我查询userinfo表的username。
userinfo.objects.get(username=’xxx’)

第二种是:all(获取到表中所有的数据)

例如我获取userinfo表的所有数据。
首先先获取到所有数据的对象
obj = userinfo.objects.all()
分别再获取具体的数据

for item in obj:
        username = item.username
        pwd = item.password
        email = item.email
        # 注意这一步,由于user_type是外键连接到usertype表的
        # 因此item.user_type是获取到usertype表的对象,所以再加 .name 获取到usertype里面的name
        userType = item.user_type.name

第三种的filter(获取多条数据,需要指定条件例如id__gt=10)

例如查询userinfo里面id大于5的,
userinfo.objects.filter(id__gt=5)
如果是等于5的直接id=5即可

查询出userinfo表里面所有用户类型大于5的。这里需要注意了,userinfo表里面并没有用户类型的字段,是有一个userType字段,这个字段是通过外键关联到了usertype表。这个usertype表里面才是存储了用户类型的。因此这个查询就需要使用连表查询了

userType是一个对象,是关联到usertype的类。因此userType__id 就是获取 userType表里面的id字段

userinfo.objects.filter(userType__id__gt=5)

查询出userinfo中所在用户组的名字包含 A的所有用户,这个也是需要连表查询
__contais=’A’ 这个就相当于sql语气的like
userType是一个对象,是关联到usertype的类因此serType__name是获取
userType表里面的name字段
userinfo.objetcs.filter(userType__name__contais=’A’)

多对多数据查询。

假如我们有两张表,RegisterUserInfo(用户信息表),还有RegisterUserByGroup用户组表)。
这个两个表的关系也是有联系的,用户信息表里面,每个用户可以在不同的用户组里面。

userinfo model

class RegisterUserInfo(models.Model):
    username = models.Charfield(max_length=50)
    password = models.Charfield(max_length=50)
    email = models.EmailField()

usergroup model

class RegisterUserByGroup(models.Model):
    groupname = models.CharField(max_length=50)
    # 与userinfo表建立多对多关联
    # 即每个个用户可以在多个不同的组里面
    user_by_group = models.ManyToManyField()

这种多对多的关系表,建立模型时候django会生成第三张表。第三张表里面存储了其他两张表的对应关系。
当我使用django模型创建完数据库表的时候,django就会自动帮我创建第三张表,因为我使用了models.ManyTomanyField()这种多对多的关系。所以django就自动为我创建了第三张表

many

第三张表里面保存了前面两张表之间数据的对应关系

django模型的连表查询_第1张图片

假如你想给第三张表添加数据。例如,我们RegisterUserInfo现在有的数据如下。
django模型的连表查询_第2张图片

RegisterUserByGroup有的数据如下
django模型的连表查询_第3张图片

对此我们可以这样,首先先查询出RegisterUserInfo的某个用户的信息,然后再插入第三张表

首先是查询数据,查询RegisterUserInfo表里面某个用户
user = RegisterUserInfo.object.get(id=1)

然后把这个查询到的用户跟某个组进行关联。我这里是关联到DBA
DBA的ID是2
这一步是获取到用户组的信息
group = RegisterUserByGroup.objects.get(id=2)

最后将用户和组关联
group是获取到的用户组 user_by_group是RegisterUserByGroup里面的一个对象。
建立了多对多关系的一个对象。.add就是添加数据 user是我们查询到的用户
group.user_by_group.add(user)

这样就把我们查询到某个用户通过第三张表,与RegisterUserByGroup里面的组进行关联了。第三张表就会添加一条数据了

django模型的连表查询_第4张图片

你可能感兴趣的:(python)