class UserInfo() class Type class Group class Favor
name = caption caption caption
t = models.Foreignkey
g = models.ManyToMany
f = models.OneToOne
一、查:
正向: obj_list = models.UserInfo.objects.all().values('t__caption','username')返回Queryset列表,每一个元素是对应的字典
obj_list = models.UserInfo.objects.all().values_list('id','username')返回Queryset列表,每一个元素是对应的元组
双下划线__能无限跨
反向查询:默认小写类名_set.all() 能通过related_name='ssss'修改 obj.ssss.all()
反向跨表:models.Type.objects.all().values('caption','ssss','ssss__name') #ssss默认是id,ssss能双下划线跨表
总结:正向与反向都能__进行跨表查询,反向只要定义related_name即可。只不过主表不一样而已。sss__name t__caption
适用于一对一、一对多和多对多。
正向通过外键字段进行跨表操作,反向通过 类_set或者related_name进行操作 obj.sss.add() obj.sss.all() obj.g.all() obj.g.add()
适用于多对多。一对多没有正向,反向可以obj.sss.all(),列出该类型所有的学生,但没有add()
1.一对一
母表查子表(查一个人的爱好)
①obj.f.caption ---->favor在一个obj中是表Favor的对象
②models.Favor.objects.get(UserInfo__name="").caption # 反向查子表
子表查母表(查这个爱好对应的人)
①models.Favor.objects.get(caption="").userinfo.name # 查名字
②models.UserInfo.objects.get(f__caption="").name # 反向查名字
2.一对多
母表查询外键表(查该用户对应的那一个类型)
①models.UserInfo.objects.get(name="").t.caption
②models.Type.objects.get(userInfo__name="").caption # 反向从类型表查该用户的类型
外键表查询母表(查该用户类型有几个用户)
①obj=models.Type.objects.get(caption="")
obj.userinfo_set.all() # 与type.userinfo_set.all()一样,拿到的是对象列表
②models.UserInfo.objects.filter(caption=models.Type.objects.get(caption=""))
# 反向传对象查询
③简化:models.UserInfo.objects.filter(t__caption='') # 外键字段__外表字段,filter,values条件跨表都要__
④id=models.Type.objects.get(caption="").id
models.UserInfo.objects.filter(t_id=id)
⑤models.Type.objects.all().values('caption','ssss__name') # 查所有的用户类型以及对应的用户名字
3.多对多
查子表(查该用户有几个组)
①obj=models.UserInfo.objects.get(name="")
obj.g.all() #对象列表
②models.Group.objects.filter(userinfo__name="")
查母表(该组有几个用户)
①obj=models.Group.objects.get(caption="")
obj.userinfo_set.all()) #与一对多类似 obj.sss.all()
②models.UserInfo.objects.filter(caption=models.Group.objects.get(caption=""))
③models.UserInfo.objects.filter(g__caption="") #简化
④id=models.Group.objects.get(caption="").id #获取id
models.UserInfo.objects.filter(f=id))
二、增
1.一对一
obj=models.Favor.objects.create(caption="")
models.UserInfo.objects.create(f=obj,name="")
2.一对多
①models.UserInfo.objects.create(t=models.Type.objects.get(caption=""),name="")
②models.UserInfo.objects.create(t_id=models.Type.objects.get(caption="").id,name="")
③obj=models.UserInfo(t=models.Type.objects.get(caption=""),name="")
obj.save()
3.多对多
正向:
①obj=models.UserInfo.objects.create(name="") #如果是已有用户,使用.get()
g_obj=models.Type.objects.all() # 必须要QuerySet对象(可理解为列表,加*),不一定全部
obj.g.add(*g_obj) # 这里添加对应关系,将用户和所有组进行关联,
# 还支持add(2,3,4),add(*[1,2,3,4]),列表要加*
②obj=models.UserInfo.objects.get(name="")
g_obj=models.Group.objects.all()
obj.g=g_obj
obj.save() #多了一步save()
反向:
obj.ssss.add([1,2])
三、改
1.一对一
f_obj=models.Favor.objects.get(caption="") #.get()等同于.filter().first()
f_obj.colors="new value"
f_obj.save()
models.UserInfo.objects.filter(name="").update(f=f_obj,name="new value")
#update(),delete()是QuerySet的方法
2.一对多
①models.UserInfo.objects.filter(t__caption="").update(name="")
②models.Type.objects.filter(t_id=models.Type.objects.get(caption="").id).update(name="")
③t_obj=models.Type.objects.get(caption="")
t_obj.userinfo_set.filter(id__gte=1).update(name="")
3.多对多
正向:
①obj=models.UserInfo.objects.get(name="")
g_obj=models.Group.objects.filter(caption__in=["",""])
#models默认只能用这种方式得到并集,如需更复杂的过滤逻辑,需使用模块Q
obj.g.clear() #清空组
obj.g.add(*g_obj) #add是追加模式,如果当前有用户组,那么执行后,会额外添加组
# ojb.g.set([2,3,4]) 不加* set表示全删了加上
②bj=models.UserInfo.objects.get(name="") #获取到一个值
g_obj=models.Group.objects.get(caption="")
obj.g.clear()
obj.g.add(g_obj) #此处没有*,区别在于多个数据时要加*
反向:
①obj=models.UserInfo.objects.get(name="")
g_obj=models.Group.objects.get(caption="")
g_obj.userinfo_set.add(obj) #从组表插入用户,多数据要加*
②obj.sss.set() #清空并新设置,原来已经有就不会先删再增加
四、删
1.一对一
models.UserInfo.objects.get(name="").delete() #对象和QuerySet都有方法delete()
models.Favor.objects.filter(caption="").delete()
models.Favor.objects.all().delete() #清空一张表
2.一对多
models.UserInfo.objects.get(name="灰裙子").delete() #对象和QuerySet都有方法delete()
models.Type.objects.filter(t="").delete()
3.多对多
正向:
删除用户的所有组关系
①obj=models.UserInfo.objects.get(name="")
g_obj=models.Group.objects.all()
obj.f=''
obj.save()
②obj=models.UserInfo.objects.get(name="")
g_obj=models.Group.objects.all()
obj.g.remove(*g_obj)
③obj=models.UserInfo.objects.get(name="")
obj.g.clear()
删除组的所有用户
①obj=models.UserInfo.objects.all() #all
g_obj=models.Group.objects.get(caption="")
g_obj.userinfo_set.remove(*obj)
②g_obj=models.Group.objects.get(caption="蓝")
g_obj.userinfo_set.clear()
删除指定
obj.g.remove(2,4)
反向:
obj.sss.remove(2,4)