django--ORM基础
做示例的数据库表
from django.db import models
# Create your models here. class User(models.Model): name=models.CharField(max_length=32,null=True) age=models.IntegerField() info=models.ForeignKey('Userinfo',null=True ) class Userinfo(models.Model): title=models.CharField(max_length=32)
在models中创建类完成后在cmd的项目文件夹下或者pycharm中的terminal框中输入
python manage.py makemigrations 生成migrations文件
python manage.py migrate 根据生成的migrations文件生成表
基础操作
def task(request): 增加信息 models.Userinfo.objects.create(title='level1') 单表查询 res=models.Userinfo.objects.all() print(res) .all()查询所有以列表包裹对象的形式返回 ==》<QuerySet [<Userinfo: Userinfo object>, <Userinfo: Userinfo object>, <Userinfo: Userinfo object>, <Userinfo: Userinfo object>]> for obj in res: print(obj.title) 循环遍历得到每个对象,可以直接点出信息 查询一个 obj=models.Userinfo.objects.first() print(obj,obj.title) ==》Userinfo object level2 .first()可以直接获得一个对象 过滤 res=models.Userinfo.objects.filter(id=2) print(res) ==》<QuerySet [<Userinfo: Userinfo object>]> 得到的同样是列表套对象 res=models.Userinfo.objects.filter(id__gt=3)#__gt(greater than)对对象属性大于某个值的对象进行筛选 print(res) ==》<QuerySet [<Userinfo: Userinfo object>, <Userinfo: Userinfo object>]> 相同的用法还有__lt(小于)__lte(小于等于)__gte(大于等于) 查询表中某一列的值 res=models.Userinfo.objects.values('title').all() print(res) ==》<QuerySet [{'title': 'level2'}, {'title': 'level3'}, {'title': 'level1'}, {'title': 'level1'}]> 得到的是列表套字典格式的目标列和对应值 res = models.Userinfo.objects.values_list('title').all() print(res) ==》<QuerySet [('level2',), ('level3',), ('level1',), ('level1',)]> 如果用.values_list方法的话会获得列表套元组格式的数据,元组内为对应列的值 一对多 查询所有 res=models.Userinfo.objects.all() 查询一个 res=models.Userinfo.objects.first() 正向查询 res=models.Userinfo.objects.filter(title='level3').all() res=models.Userinfo.objects.all() 和上面一样得到列表套对象格式的返回值都可以通过遍历拿到对象点出 反向查询 查询所有等级为level1的人 res= models.Userinfo.objects.all() for obj in res: print(obj.id) ==》2 print(obj.title) ==》level2 print(obj.user_set.all()) ==》<QuerySet [<User: User object>]> 使用_set的方法可以反向查询外键关联的表查询得到列表套对象的格式 重点之__ res= models.User.objects.values('info__title') print(res) ==》<QuerySet [{'info__title': 'level2'}, {'info__title': 'level3'}]> 在查询User表的时候通过__加上Userinfo中的列名可以直接查询到Userinfo表中的数据 return HttpResponse('ok')
在一对多表中如果删除了外键的数据那么所有关联此条数据的行都会被删除,这是django中的级联删除机制
ut = models.ForeignKey("UserType", null=True, on_delete=models.CASCADE) CASCADE: 设置级联删除 SET_NULL : 取消级联删除