• 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
  • 相关阅读:
    Java 泛型 泛型的约束与局限性
    Java 泛型 泛型方法
    Java 泛型 泛型数组
    Java 泛型 协变性、逆变性
    Java 泛型 协变式覆盖和泛型重载
    Java 泛型 泛型代码和虚拟机
    Insertion Sort List
    Remove Duplicates from Sorted List II
    String to Integer (atoi)
    SpringMvc源码入门
  • 原文地址:https://www.cnblogs.com/xuchengcheng1215/p/9381515.html
Copyright © 2020-2023  润新知