zoukankan      html  css  js  c++  java
  • Django 07 Django模型基础2 (常用查询和多表关联)

    Django 07 Django模型基础2 (常用查询和多表关联)

    一、常用查询

    #查找数据
    def search_user(request):
        #获取
        rs = User.objects.first() #获取第一条数据
        rs = User.objects.last() #获取最后一条数据
        rs = User.objects.filter(name = 'TAKA') #获取name为TAKA的数据,返货queryset类型,可以用rs[0]来查询
        rs = User.objects.exclude(name = 'TAKA') #排除name为TAKA的数据
        rs = User.objects.get(name = 'TAKA') #获取name为TAKA的记录对象,获取的对象具有唯一性,如果获取多个就报错
    
        #排序 order_by
        rs = User.objects.order_by('age') #以age为准则正向排序
        rs = User.objects.order_by('age','id') #以age为第一准则,id为第二准则正向排序
        rs = User.objects.order_by('-age') #以age为准则逆向排序
    
        #其他方法
        rs = User.objects.all().values() #将返回的qureyset中的model转换为字典
        rs = User.objects.count()   #获取当前查询的数据的总数
    
        rs = User.objects.filter(name__exact='budong') #name_exact相当于name
        rs = User.objects.filter(name__iexact='budong') #name_iexact跟上面的区别是这个忽略大小写
    
        #模糊查询
        rs = User.objects.filter(name__contains='i') #name中包含i的对象
        rs = User.objects.filter(name__icontains='i') #name中包含i的对象,忽略大小写
    
        rs = User.objects.filter(name__startswith='b') #name中以b开头的的对象
        rs = User.objects.filter(name__istartswith='b') #name中以b开头的的对象,忽略大小写
    
        rs = User.objects.filter(name__endswith='b')  # name中以b结尾的的对象
        rs = User.objects.filter(name__iendswith='b')  # name中以b结尾的的对象,忽略大小写
    
        rs = User.objects.filter(age__in=[18,19,20]) #in成员所属,age在18,19,20的对象
        rs = User.objects.filter(age__gt=18)   #age大于18的对象
        rs = User.objects.filter(age__gte=18)   #age大于等于18的对象
        rs = User.objects.filter(age__lt=18)   #age小于18的对象
        rs = User.objects.filter(age__lte=18)   #age小于18的对象
        rs = User.objects.filter(age__range=(18,20))   #age在18到20之间的对象,都包括
        rs = User.objects.filter(age__isnull=True)   #判断age栏是否为空 
    
    
        print(rs)
        return HttpResponse('查找数据成功')

    二、常用类型和字段参数

    #常用的字段类型映射关系
     int             -----------   IntegetField #整型,映射到数据库中的int类型
    varchar       -----------   CharFileld #字符串类型,通过max_length指定最大长度
    longtext      -----------   TextFiled   #长文本
    tinyint         -----------   BooleanField #布尔类型,在使用的时候,传递True/False进去;如果为空,则为NullBooleanField
    date           -----------    DateFiled  #日期;在使用的时候,可以设DateField.auto_now_add当对象第一次被创建的时候自动设置创建时间
    datetime     -----------    DatetimeField  #时间
    #Field的常用参数
    primary_key #主键
    unique #唯一键
    null  #是否为空,默认为False
    blank #等于True时form表单验证是可以为空,默认为False
    default #默认值
    DateField.auto_now#每次修改都会把当前时间更新进去,只用调用Model.save()方法才会调用,Queryset.update方法将不会调用。这个参数只是Date和Datetime以及Time类才有的
    Datetime.auto_now_add# 第一次添加进去,都会讲抢钱时间设置进去。以后修改,不会修改这个值
    class Ftest(models.Model):
        name = models.CharField(max_length=30,unique=True) #名字,最大长度30,唯一键
        age = models.IntegerField() #年龄
        note = models.TextField() #长文本
        gender = models.BooleanField(default=True) #性别,默认为女(1)
        create_time = models.DateTimeField(auto_now_add=True) #创建时间,不更改
        update_time = models.DateTimeField(auto_now=True) #更新时间,会自动更改
    
    
    
    
    from .models import Ftest
    def add_ftest(request):
        Ftest.objects.create(name='爱宝贝',age=25,note='啦啦啦啦',gender=False)
        return HttpResponse('插入数据成功')
    
    def update_ftest(request):
        # Ftest.objects.filter(id=2).update(age=80) #使用fiiter是不能成功使用auto_now的,因为是queryset
        f = Ftest.objects.get(id=2) #get获取的对象,在使用save才能成功使用auto_now
        f.age = 55
        f.save()
        return HttpResponse('更新数据成功')

    三、表关系的建立

    from django.db import models
    
    
    # Create your models here.
    class Department(models.Model):
        d_id = models.AutoField(primary_key=True)
        d_name = models.CharField(max_length=30)
    
    
    class Student(models.Model):
        s_id = models.AutoField(primary_key=True)
        s_name = models.CharField(max_length=30)
        department = models.ForeignKey('Department', on_delete=models.CASCADE)  # 由于有学生所属学院的关系在,要将这个表与Department表关联在一起,
        # 就可以用外键约束起来,这个department关联的是Department表的id,on_delete表示的是上面的数据删除,这个表也会把相关的数据删除
        #一对多关系用外键约束即可,默认关联表的主键
    
    class Stu_Detail(models.Model):
        s_id = models.OneToOneField('Student',on_delete=models.CASCADE) #一对一关系,用Onetoone;同样要加上on_delete
        age = models.IntegerField()
        gender = models.BooleanField(default=1)
        city = models.CharField(max_length=30)
    
    class Course(models.Model):
        c_id = models.AutoField(primary_key=True)
        c_name = models.CharField(max_length=30)
        student = models.ManyToManyField('Student') #课程表和学生信息表有这多对多的关系,直接用Manytomany来实现关联,会生成一个中间表,不用加on_delete
  • 相关阅读:
    webpack-dev-server报错
    npm run dev 报错 run `npm audit fix` to fix them, or `npm audit` for details
    vscode里使用.vue代码模板的方法
    console.log()中的%d,%s等代表的输出类型
    使用Babel将单独的js文件 中的 ES6转码为ES5
    jQuery选择什么版本 1.x? 2.x? 3.x?
    在线jquery.min.js、vue.min.js引用
    WebSocket对象的“readyState”属性记录连接过程中的状态值
    vue项目中,使用vue-awesome-swiper插件实现轮播图
    vue-cli 项目里屏幕自适应
  • 原文地址:https://www.cnblogs.com/xuchengcheng1215/p/9381515.html
Copyright © 2011-2022 走看看