一对多--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() #此类型用户数量 |