在数据库当中,可以通过设置外键的方式将两个表进行连接,如果需要查询数据的时候就需要进行连表查询。
例如:假如我现在有两张表。userinfo 和 usertype,userinfo里面记录了用户的信息,usertype表里面记录了用户的角色。
两个表是通过外键进行关联。
class usertype(models.Model):
name = models.Charfield(max_length=50)
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表里面才是存储了用户类型的。因此这个查询就需要使用连表查询了
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用户组表)。
这个两个表的关系也是有联系的,用户信息表里面,每个用户可以在不同的用户组里面。
class RegisterUserInfo(models.Model):
username = models.Charfield(max_length=50)
password = models.Charfield(max_length=50)
email = models.EmailField()
class RegisterUserByGroup(models.Model):
groupname = models.CharField(max_length=50)
# 与userinfo表建立多对多关联
# 即每个个用户可以在多个不同的组里面
user_by_group = models.ManyToManyField()
这种多对多的关系表,建立模型时候django会生成第三张表。第三张表里面存储了其他两张表的对应关系。
当我使用django模型创建完数据库表的时候,django就会自动帮我创建第三张表,因为我使用了models.ManyTomanyField()这种多对多的关系。所以django就自动为我创建了第三张表
第三张表里面保存了前面两张表之间数据的对应关系
假如你想给第三张表添加数据。例如,我们RegisterUserInfo现在有的数据如下。
对此我们可以这样,首先先查询出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里面的组进行关联了。第三张表就会添加一条数据了