一个类代指一个表 一个对象代指一行数据 一个外键代表关联另一张表的一行数据
注意事项:
尽量减少一次查询多个表查询主表的不同 相当于 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.idobj.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')