django 跨表 反向 一对多 多对多 补充

一个类代指一个表 一个对象代指一行数据 一个外键代表关联另一张表的一行数据

注意事项:

尽量减少一次查询多个表
查询主表的不同 相当于 left join   right join 


主表不同  不存在则显示none  双下划线跨表  
models.Student.objects.all().values('username','cs__titile')  # 正向
models.Classes.objects.all().values('titile','ssss__username')  # 反向

+++++++++++++++++++++++ QuerySet 集合

最外层都为QuerySet集合
ret = Student.objects.all()  # ret 为QuerySet集合 
****[obj,obj,obj] 集合中为对象

value
ret = Student.objects.all().value('id','username')
[{'id':1,'username':'x'},{'id':2,'username':'o'}]  
****集合中字典类型


value_list
ret = Student.objects.all().value_list('id','username')
[('id':1,'username':'x'),('id':2,'username':'o')]  
****集合中为元组


++++++++++++++++++++++++++++++ 反向 与 跨表 
跨表(同过外键双下划线查询下一张表字段 obj.objects.all().value('name','cs__name')
反向(1表中不含有外键 查询2表(2表与1表有外键关联) 
通过关联表 类名__set().all() 可以取到字段
student__set().all()


filter 和 value中可以跨表 查询


跨多张表 stu_list = Student.objects.all().values('username','cs__titile','cs__fk__name')  # ck fk 为外键

++++++++++++++++ 多对多

obj = models.Classes.all().values('id','title','m','m__name')
加values过滤取值不可以对第三张表进行取值  拿到的是int类型
用all()的方式可以使用外键进行取值  拿到的是对象
不使用别名    related_name='自定义'  无法反向查找

*****  m为Django创建的第三张表 关联两张表

obj = Classes.objects.filter(id=1).first()
obj.m.add(2)
obj.m.add([4,3])

obj = Classes.objects.filter(id=1).first()

删除:

obj.m.remove([4,3])

清空:

obj.m.clear()

重置:

obj.m.set([2,3,4])

查询:

obj.id
obj.titile

ret = obj.m.all()

————————  多对多

也可以使用别名    related_name='自定义'
m为Django创建的第三张表  m 在Classes表中  

正向添加:

obj = models.Classes.objects.filter(id=2).first()
obj.m.add(3)

反向添加:

obj = models.Teachers.objects.filter(id=3).first()
obj.clesses_set.add(2)


反向修改:

obj = models.Teachers.objects.filter(id=2).first()
obj.clesses_set.set([1,2])  # 数据库只保留 Teacher为1 对应的classes 为1,2的  

正向修改:

obj = models.Classes.objects.filter(id=3).first()
obj.m.set([1,2])



######################## 单表 ########################

增加
Teachers.objects.create(name='root')
obj = Teachers(name='root')
obj.save()

Teachers.objects.all()
Teachers.objects.filter(id=1)
Teachers.objects.filter(id=1,name='root')
result = Teachers.objects.filter(id__gt=1)
[obj(id,name),]
result = Teachers.objects.filter(id__gt=1).first()
删除
Teachers.objects.filter(id=1).delete()

Teachers.objects.all().update(name='alex')
Teachers.objects.filter(id=1).update(name='alex')

####################### 一对多 ### ######################

增加:
student.objects.create(username='root',age=12,gender='男',cs_id=1)
student.objects.create(username='root',age=12,gender='男',cs_id=Classes.objects.filter(id=1).first())


查看:
ret = Student.objects.all()
[obj(),obj()]
for i in ret:


删除:
Student.objects.filter(id=1).delete()
Student.objects.filter(cs_id=1).delete()
跨表:
Student.objects.filter(ccs__name).delete()




创建项目流程:

创建app(详情查看  https://blog.csdn.net/weixin_42100915/article/details/80631190)

python manage.py startapp 应用名  

创建数据库:(详情查看  https://blog.csdn.net/weixin_42100915/article/details/80641473)

python manage.py makemigrations (在migrations包下出现0001_initial.py 文件)

python manage.py migrate

配置静态文件:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR,'static'),
)

路径分发:

from app01.views import classes
path('add_c.html',classes.add_c)
 
 

html 页面:跳转路径    提交方式  {% crsf_token %}

<form action="add_c.html" method="post">
    {% csrf_token %}
    <input type="text" name="add">
   <input type="submit" value="完成">
</form>

后端函数接收:

tile = request.POST.get('add')


猜你喜欢

转载自blog.csdn.net/weixin_42100915/article/details/80682966