zoukankan      html  css  js  c++  java
  • 07 Django -- ORM单边查询

    单表常用的查询方式

    models.py 图书馆管理

    from django.db import models
    
    # Create your models here.
    
    
    class MyLibrarys(models.Model):
    
        id = models.AutoField(primary_key=True)
    
        name = models.CharField(max_length=16)
    
        price = models.DecimalField(max_digits=5, decimal_places=2)
    
        publication_date = models.DateField()
    
        press = models.CharField(max_length=16)
    
        def __str__(self):
            return self.name
    

    all(): 查询所有结果,结果是Queryset类型

    ret = models.MyLibrarys.objects.all()
    # 结果时Queryset类型<QuerySet [<MyLibrarys: python1>,...]
    

    filter():

    返回Queryset类型,Queryset类型的数据还能够继续调用fitler方法

    ret = models.MyLibrarys.objects.filter()
    # 获取全部数据,Queryset类型
    ret = models.UserInfo.objects.filter(id=1000)
    # 查不到数据不会报错,返回一个空的<QuerySet []>
    

    and():

    ret = models.UserInfo.MyLibrarys.filter(name='alex',press='清华出版社')
    

    get():(只能查一个model对象)

    ​ 返回与所给筛选条件相匹配的对象,不是queryset类型,是行记录对象,返回结果有且只有一个,
    如果符合筛选条件的对象超过一个或者没有都会抛出错误。

    ret = models.MyLibrarys.objects.get(id=2)# 得到的是一个model对象
    # 查不到数据会报错
    # 查到多个也会报错,例如name以a开头的全部model对象
    

    exclude():

    ​ 排除的意思,它包含了与所给筛选条件不匹配的对象,没有不等于的操作昂,用这个exclude,返回值是Queryset类型

    ret = models.MyLibrarys.objects.exclude(name='alex')
    # objects能调用exclude
    ret = models.UserInfo.objects.all().exclude(name='alex') # Queryset也能调用exclude
    

    order_by() :升序

    ​ Queryset类型的数据来调用,对查询结果排序,默认是按照id来升序排列的,返回值还是Queryset类型

    ret = models.MyLibrarys.objects.all().order_by('字段')
    # 升序
    
    ret = models.MyLibrarys.objects.all().order_by('-字段')
    # 降序
    
    ret = models.MyLibrarys.objects.all().order_by('-age',id)	# 以age降序排列,age相同的以id升序排序
    

    reverse():反转

    Queryset类型的数据来调用,对查询结果反向排序,返回值还是Queryset类型。(数据排序之后才能反转)

    models.MyLibrarys.objects.all().order_by('id').reverse()
    # Qureyset类型
    

    count(): 计数,统计返回结果的数量

    models.MyLibrarys.objects.all().count()
    

    first() / last():

    获取拿到的第一/最后一条数据,结果是model对象

    models.MyLibrarys.objects.all().first()		# 也可
    

    exists()

    Queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False

    models.MyLibrarys.objects.filter(id=2).exists()
    

    values()

    Queryset类型的数据来调用,返回的QuerySet类型,里面是字典类型数据。

    models.MyLibrarys.objects.all().values('name', 'press')
    
    返回QuerySet对象,里面存放字典<QuerySet [{'name': 'python1', 'press': '人民出版社'}...]>
    
    models.MyLibrarys.objects.all().values()
    # 返回QuerySet对象,获取所有数据
    
    models.MyLibrarys.objects.values()	# objects调用,取所有数据
    

    values_list()

    Queryset类型的数据来调用,返回的QuerySet,里面是数组类型数据。

    models.MyLibrarys.objects.all().values_list()
    

    distinct():去重

    values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录

    ret = models.MyLibrarys.objects.all().values('字段').distinct()		# 对某一字段查询结果去重
    
    ret = models.MyLibrarys.objects.all().values_list('press').distinct()
    

    filter双下划线的查询

    models.MyLibrarys.objects.filter(price__in=[100,200,300]) #price值在这三个里面的任意一个的QuerySet对象
    
    models.MyLibrarys.objects.filter(price__gt=100)  #大于,大于等于是price__gte=100,别写price>100,这种参数不支持
    models.MyLibrarys.objects.filter(price__lt=100)
    models.MyLibrarys.objects.filter(price__range=[100,200])  #sql的between and,大于等于100,小于等于200
    models.MyLibrarys.objects.filter(name__contains="python")  #name值中包含python的
    models.MyLibrarys.objects.filter(name__icontains="python") #不区分大小写
    models.MyLibrarys.objects.filter(name__startswith="py") #以什么开头,istartswith  不区分大小写
    models.MyLibrarys.objects.filter(name__endswith="py") #以什么结尾,iendswith  不区分大小写
    
    xx__isnull=True		# xx字段的值为空的所有数据
    

    日期:

    models.MyLibrarys.objects.filter(pub_date__year=2012) #日期为2012年,  '2012'字符串也行
    
    models.MyLibrarys.objects.filter(pub_date__year__gt=2012)
    # 大于2012
    
    models.MyLibrarys.objects.filter(pub_date='2012-12-12')	# 查询2012-12-12
    
    models.MyLibrarys.objects.filter(pub_date__year=2012,pub_date__month=12,pub_date__data=12)	# 查询2012-12-12
    

    多表查询

    表结构

    id字段可以不写,自动添加。

    一一对应:OneToOneField()

    class Author(models.Model):
    
        字段=models.OneToOneField(to='表类名',to_field='id',on_delete=models.CASCADE)
    
        简写:
        字段=models.OneToOneField('表类名',on_delete=models.CASCADE)
        # 默认找id字段一一对应
    

    多对一:Foreignkey()

    db_constraint=False --取消强制约束效果

    字段=models.ForeignKey(to="类名",
    on_delete=models.CASCADE,)
    

    多对多:ManyToManyField()

    ManyToManyField自动创建第三张表

    字段=models.ManyToManyField(to='表类名',)
    # 自动默认关联两张表的id
    

    元信息Meta:

    ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。

    class Author(models.Model):
    
    	class Meta:
            db_table='authordetail' #指定表名
            ordering = ['-id',]		#指定按什么字段排序 只有设置了该属性,查询到的结果才可以被reverse(),否则只能对排序后的结果进行反转(order_by()方法排序过的数据)
            index_together		#联合索引。
    		unique_together		# 联合唯一索引。
    
    

    示例:

    from django.db import models
    
    # Create your models here.
    
    class Author(models.Model):
        """
        作者表
        """
        name=models.CharField( max_length=32)
        age=models.IntegerField()
        # authorDetail=models.OneToOneField(to="AuthorDetail",to_field="nid",on_delete=models.CASCADE)  #
        auth=models.OneToOneField("AuthorDetail",on_delete=models.CASCADE)
    
    class AuthorDetail(models.Model):
        """
        作者详细信息表
        """
        birthday=models.DateField()
        telephone=models.CharField(max_length=11)
        addr=models.CharField(max_length=64)
        # class Meta:
            # db_table='authordetail' #指定表名
            # ordering = ['-id',]
    class Publish(models.Model):
        """
        出版社表
        """
        name=models.CharField( max_length=32)
        city=models.CharField( max_length=32)
    
    class Book(models.Model):
        """
        书籍表
        """
        title = models.CharField( max_length=32)
        publishDate=models.DateField()
        price=models.DecimalField(max_digits=5,decimal_places=2)
        publishs=models.ForeignKey(to="Publish",on_delete=models.CASCADE,)
        authors=models.ManyToManyField('Author',)
    
  • 相关阅读:
    idea 搭建spring boot
    面向对象
    idea 转普通项目为maven 项目
    java 基础
    设计模式
    GeneratedKeyHolder的作用:获得新建主键值
    Oracle中Merge into的用法实例讲解
    深入理解Java线程池:ThreadPoolExecutor
    java Timer(定时调用、实现固定时间执行)
    js实现数组去重
  • 原文地址:https://www.cnblogs.com/yzm1017/p/11674428.html
Copyright © 2011-2022 走看看