zoukankan      html  css  js  c++  java
  • Django框架之ORM的相关操作(一)

    一、一般操作

    from django.db import models
    import datetime
    
    # Create your models here.
    
    class Author(models.Model):
        id=models.AutoField(primary_key=True)
        name=models.CharField(max_length=20)
        # 以下是测试字段
        numtest=models.IntegerField()
        datetest=models.DateField(null=False,default=datetime.datetime(year=2000,month=1,day=1))
    
        def __str__(self):
            return "名字:%s,数字:%d,日期:%s" %(self.name,int(self.numtest),self.datetest)
        # 设置创建的表名
        class Meta:
            db_table="person"

    以上是模型类,按照这个模型类进行记录相关操作

    (1)all() 查询所有结果

    通过遍历获取每个值

    (2)filter(**kwargs) 根据指定条件获取对象,get(**kwargs) 根据指定条件获取对象

    区别:filter方法是根据指定条件获取所有的匹配对象,如果没有获取匹配的对象,那么就返回空列表;get方法是根据指定对象获取唯一的值,如果存在大于1条或者0条数据时,get方法就会报错

     

    (3)exclude(**kwargs) 获取所选条件不匹配对象

    (4)values(*filed) 返回一个元素是字典的列表对象,返回所有对象;filed参数是指定显示的字段,如果不指定则显示全部字段。

    (5)values_list(*field)  返回元素是元组的列表,返回所有的值,使用方法和values()类似

    (6)order_by(*filed) 将所有查询出来的对象按照条件进行排序

    (7)order_by(*filed).reverse() 反向排序

    (8)distinct() 从返回结果中剔除重复的记录

    (9)count() 返回查询结果的数量

    (10)first() 查询第一条数据

    (12)last() 返回查询出来的数据,取最后一条数据

    (13)exists() 返回结果不为空返回True,否则返回False

    ================================================================================================

    二、单表查询之双下划线

    模型类

    class Student(models.Model):
        id=models.AutoField(primary_key=True)
        name=models.CharField(max_length=10)
        age=models.IntegerField(default=0)
    
        classes=models.ForeignKey(to="Classes",on_delete=models.CASCADE)
    
        class Meta:
            db_table="stu"
    
        def __str__(self):
            return "{}:{}".format(self.id,self.name)
    
    class Classes(models.Model):
        id=models.AutoField(primary_key=True)
        cls=models.CharField(max_length=20)
    
        class Meta:
            db_table="cls"
    
        def __str__(self):
            return "{}:{}".format(self.id,self.cls)

    (1)id__gt=5 表示id大于5,id_lt=10 表示id小于10  (字段是数字类型的,可以这样使用,比如age字段是数字类型,那么就可以使用age_gt=20表示年龄大于20)

    (2)id__in=[4,5,6] 表示id=4,5,6的

    表示查询id不是4,5,6

    (3)name__contains="王" 表示字段是name中包含王字的信息

    (4)name__icontains="M" 表示字段是name中包含m的信息,不区分大小写

    (5)id__range=[2,5] 表示查询id在2到5的信息

    (6)name_startswith="A" 表示字段name是以A开头的信息

    (7)name_istartswith="a" 表示字段name是以a开头的信息,不区分大小写

    (8)name_endswith="A" 表示字段name是以A结尾的信息

    (9)name_iendswith="A" 表示字段name是以A结尾的信息,不区分大小写

    ================================================================================================

    三、ForeignKey操作(一对多)

    (1)正向查询1(通过对象查询)

    对象.关联字段.字段

    例如:通过图书获取出版社名称

    使用get方法获取到的是一个模型类的对象,只需要使用对象.关联字段.字段就可以获取到。

    而filter方法获取到的是一个QuerySet对象,也就是一个列表,取出需要的信息,通过索引取到,所以可以使用对象[i].关联字段.字段。或者可以使用遍历循环将每个对象获取到,然后再对象.关联字段.字段。

    (2)正向查询2(通过字段查询)

    关联字.字段

    (3)反向查询之方法一

    表:Student(学生表,学生信息表示多,有外键),Classes(教室表,教室表信息表示一,没有外键)

    反向查询表示通过一查询多,也就是通过教室表的某个教室查询出所对应的信息

    语法:1.获取到某个教室的对象 2.教室信息.学生表小写_set.all()

    (4)反向查询之方法二

    =======================================================================================

    四、多对多表的相关操作

    # 查询id=3的作者写过的全部的书
        author = models.Author.objects.get(id=3)
        books1=author.book.all()

     create()  创建一个新的对象,保存对象,并将它添加到关联对象集之中,返回新创建的对象。

    # 通过作者创建一本书,自动保存
        # 做了两件事:1.在book表中创建一本新书,2,在作者和书的关系表中添加关联记录
        author = models.Author.objects.get(id=2)
        author.book.create(name="python成长之路")

     add() 把指定的model对象添加到关联对象集中

    # 将已存在的作者和书籍关联起来
        author = models.Author.objects.get(id=2)
        book2=models.Books.objects.get(id=2)
        author.book.add(book2)
    # 将已存在的作者和书籍关联起来(批量关联)
        author = models.Author.objects.get(id=2)
        book3=models.Books.objects.all()
        author.book.add(*book3)

     remove() 从关联对象集中移除执行的model对象

    # 删除作者和书籍关联起来的某一条记录,例如:删除作者id是3,书的id是7的记录
        get_author=models.Author.objects.get(id=3)
        get_author.book.remove(7)

     clear() 从关联对象集中移除一切对象。

    # 删除某个作者下的所有书籍关联起来的记录,例如:删除作者id是3下的所有书籍
        get_author=models.Author.objects.get(id=3)
        get_author.book.clear()

     set() 更新model对象的关联对象

    book_obj = models.Book.objects.first()
    book_obj.authors.set([2, 3])

    ====================================================================

    外键的反向操作

    更新了模型类

    from django.db import models
    
    # Create your models here.
    
    class Author(models.Model):
        id=models.AutoField(primary_key=True)
        name=models.CharField(max_length=10)
        book=models.ManyToManyField(to="Books")
    
    
    class Books(models.Model):
        id=models.AutoField(primary_key=True)
        name=models.CharField(max_length=20)
    
        book_publisher=models.ForeignKey(
            to="Publisher",
            null=True,
            on_delete=models.CASCADE,
            related_name="publisher_book"
        )
    
    
    class Publisher(models.Model):
        id=models.AutoField(primary_key=True)
        name=models.CharField(max_length=20)
    # 外键的反向操作
        # 查询出版社下的所有图书 出版社:多  图书:一  外键添加在图书类中
        get_publisher=models.Publisher.objects.get(id=1)
        get_books=get_publisher.publisher_book.all()
        books_list=[]
        for b in get_books:
            books_list.append(b.name)
        print(books_list  )
    # 删除出版社id=1下的所有图书(相当于将外键的指向删除)
        get_publisher=models.Publisher.objects.get(id=1)
        get_publisher.publisher_book.clear()
  • 相关阅读:
    协程
    多进程
    多线程
    模块进阶
    内建函数
    内建属性
    属性property
    私有化
    深拷贝、浅拷贝
    ==、is
  • 原文地址:https://www.cnblogs.com/fjiqiang/p/10915602.html
Copyright © 2011-2022 走看看