一对多--foreignkey
应用场景
当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。
创建表
根据代码中定义的类来自动生成数据库表。
1
2
3
4
5
6
7
|
class UserType(models.Model):
caption = models.CharField(max_length = 32 )
class UserInfo(models.Model):
user_type = models.ForeignKey(UserType) # user_type对象中封装id,caption
username = models.CharField(max_length = 32 )
age = models.IntegerField()
|
创建数据
caption数据
1
2
3
|
for co in [ 'CEO' , 'CTO' , 'COO' ]:
dic = { 'caption' :co}
models.UserType.objects.create( * * dic)
|
userinfo数据
两种方法:
NO.1
1
2
|
dic = { 'username' : 'xx' , 'age' : 88 , 'user_type_id' : 1 }
models.UserInfo.objects.create( * * dic)
|
NO.2
1
2
|
dic = { 'username' : 'xx' , 'age' : 88 , 'user_type' :models.UserType.objects.get( id = 1 )}
models.UserInfo.objects.create( * * dic)
|
普通查找
1
2
3
|
result = models.UserInfo.objects. all ()
for item in result:
print item.username,item.age,item.user_type.caption
|
正向查找
foreignkey在这张表中叫正向查找,跨表filter用双下划线
例如:找所有CEO的用户
1
|
models.UserInfo.objects. filter (user_type__caption = 'CEO' )
|
反向查询
反向查询时,除了自己的id和caption列,Django的ORM多提供了一个UserInfo_set列,还可以在他的基础上加条件
获取用户类型CEO,并且用户名是xxx的
1
2
|
line = models.UserType.objects.get( id = 1 )
print line.userinfo_set. filter (username = 'xxx' )
|
获取某个人是什么用户类型?当前用户类型下有多少人?
userinfo是Django在UserType表中自动创建的隐藏字段
1
2
3
|
user_type_obj = models.UserType.objects.get(userinfo__username = 'xxx' )
print user_type_obj.caption #用户类型
print user_type_obj.userinfo_set. all ().count() #此类型用户数量
|