Django ORM 关联查询

1、一对多
a) 查询,主表查询子表所有数据
如果在子表中,添加了related_name, 那么父表获取子表的数据不再是使用子表的类名小写_set.all()获取,那么使用related_name_set.all()获取

b) 新增:
先添加主表,再添加子表

c) 修改:
a) 可以一次修改主表下所有子表记录
b) 通过子表也可修改主表信息


d) 删除:
1)如果子表删除,不会影响主表
2)删除主表数据,且设置级联删除,那么删除顺序是先删子表,再删主表

e) 根据Question查询Choice
1) 查询问题主键为1的选项中内容包含'一' 主表查主表
Question.objects.get(pk=1).choice.filter(choice_text__contains = '一')返回的是QuerySet(Choice)
2)查询选项以‘一’结尾的问题
Question.objects.filter(choices__choice_text__endswith='一')
这里使用了设置好的related_query_name的choices,默认是类名小写

related_name和related_query_name的区别:
1、related_name默认是choice_set, related_query_name默认是多方的model类名小写
2、related_name是根据父表查询子表数据使用, related_query_name是子表过滤父表数据,称为方向查询


#修改选项主键为1的问题的发布时间为2001-10-09
q = Choice.obejcts.get(pk=1).question
q = Question.objects.get(choices__pk=1)
q.pub_date = '2001-10-09'
q.save()

多对多:
Teacher与Student,在Student模型中维护关联关系
那么通过老师获取学生
t1.student_set.all()
通过学生获取老师
s1.teachers.all()

添加:使用集合的add()方法进行添加到中间表
t1 = Teacher.objects.create(name='', gender=1, birth='', is_married=1)
# 想要添加学生
s1 = t1.student_set.create(name='', gender=1, birth='')
s2 = t1.student_set.create(name='', gender=1, birth='')
# 学生想要添加老师
t2 = s1.teachers.create(name='', gender=1, birth='', is_married=1) # 自己试试
# 把学生2添加t2老师
t2.student_set.add(s2)

修改:
# 修改t2下的s1学生的出生日期
s1 = t2.student_set.get(pk=s1)
s1.birth = ''
s1.saves()

删除:删除中间表remove(*objs), clear()清空

查询:prefetch_related()查询


自定义多对多的关联关系-CRUD


一对一关联:
主表UserInfo 子表UserContact
插入数据:
1、先添加主表
u = UserInfo.objects.create(userName=, password=)
2、添加子表
uc = UserContact.objects.create(userInfo=u, phone='', email='')
查询:
1、查询获取姓名为张三的用户id,手机号
UserInfo.objects.values('id', 'usercontact_phone').get(userName='张三')
2、获取手机号为136的用户信息
UserInfo.objects..get(usercontact__phone__startswith = '136')

修改:
用户为张三的手机号为13777777777

uc = UserContact.objects.get(userInfo__userName='张三')
uc.phone = '111'
uc.save()

猜你喜欢

转载自www.cnblogs.com/Minlwen/p/10491518.html
今日推荐