60 Django -- ORM单边查询

目录

  • 单表常用的查询方式
  • filter双下划线的查询
  • 多表查询
    • 表结构
    • 元信息Meta:

单表常用的查询方式

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类型,...]

filter():

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

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

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对象,里面存放字典

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',)

你可能感兴趣的:(60 Django -- ORM单边查询)