您现在的位置是:首页 > 正文

Django之ORM操作

2024-02-01 05:02:29阅读 3

以下信息可能有些并不完整或者有些错误的理解,我会在以后的学习过程中进行修改

Queryset数据类型
QuerySet与惰性机制
所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。

QuerySet特点:
    <1>  可迭代 
    <2>  可切片
    <3>  惰性计算和缓存机制

model.py创建表单

from django.db import models
class Book(models.Model):
    title = models.CharField(max_length=6,verbose_name="书名") 
    author = models.ManyToManyField('Author')
    publish = models.ForeignKey('Publish', on_delete=models.CASCADE)
    price = models.IntegerField()
class Publish(models.Model):
	name = models.CharField(max_length = 30)
    address = models.CharField(max_length = 50)
class Author(models.Model):
    name = models.CharField(max_length = 30)
    sex = models.BooleanField(max_length=1, choices=((0, '男'),(1, '女'),))
    email = models.EmailField()
    address = models.CharField(max_length=50)
    birthday = models.DateField()

ORM常用的QuerySet接口
增加

单表添加:
1、
	表名.objects.create(**kwargs)
	Book.objects.create(title="Django 企业开发实战"...)
2、
	book = 表名(**kwargs)
	book.save()
3、
	author = 表名()
	author.name = ''
	author.save()
一对多添加:
1、
    publish_obj = Publish.objects.get(name="人民邮电出版社")
    author_obj = Author.objects.get(name="the5file")
    Book.objects.create(title="Django 企业开发实战",author=author_obj,publish=publish_obj)
2、
	book = Book(title="Django 企业开发实战",author=author_obj,publish=publish_obj)
	book.save()
多对多添加:
1、
	book = Book.objects.get(title="Django 企业开发实战")
    author_obj = Author.objects.get(name="the5file")
    book.author.add(author_obj) # 要添加多个只需写多个参数就可以了
    add(*objs,bulk = True,through_defaults = None)
2、
	book.author = author_obj
	book.save()
3、
	b = Blog.objects.get(id=1)
	e = b.entry_set.create(
    	headline='Hello',
    	body_text='Hi',
    	pub_date=datetime.date(2005, 1, 1)
 	)
4、
	b = Blog.objects.get(id=1)
 	e = Entry(
    	blog=b,
    	headline='Hello',
    	body_text='Hi',
    	pub_date=datetime.date(2005, 1, 1)
    )
	e.save(force_insert=True)
	---------------------
	

查询

1、表名.objects.filter(**kwargs)  # 包含与所给筛选条件相匹配的对象,可迭代,可切片
   Author.objects.fileter(id=1)
2、表名.objects.all()   # 查询所有结果,可迭代,可切片
   Author.objects.all
3、表名.objects.get(**kwargs)  # 返回与所筛选元素相匹配的对象,返回结果有且只有一个,如果对象不存在或超过一个,则会报错,不建议使用
   Author.objects.get(id=1)
4、表名.objects.values(*field) # 返回一个可迭代的字典序列
   Author.objects.vlaues('id', 'name', 'address')
5、表名.objects.exclude(**kwargs)  # 包含了与所给筛选条件不匹配的对象与filter相反的逻辑
6、基于Queryset的查询
    order_by(*field) # 对查询结果排序  加一个-表示降序,不加时升序,随机排列则为'?',即order_by('?'),多次使用order_by,后一个会覆盖前一个,没有参数表示清除所有的排序
    reverse()  # 对查询结果反向排序
    distinct()  # 从返回结果中剔除重复的记录
    values()  # 返回某个字段的值,结果是包含dict的QuerySet
    演示:book = Book.objects.filter(id=5).values('title')
    还可以用关键字参数,将参数传递给annotate(),给queryset添加属性。
    -------------------------
    from django.db.models.functions import Lower
 	Blog.objects.values(lower_name=Lower('name'))
	<QuerySet [{
   'lower_name': 'beatles blog'}]>
	----------------------------------------
	另外一种用法,与聚合语句一起使用
	-----------------------------------------
	class Blog(models.Model):
	    name = models.CharField(max_length=100)
	    tagline = models.TextField()
	    def __str__(self

网站文章

  • 2_5_LeetCode刷题总结(基本算法)动态规划

    2_5_LeetCode刷题总结(基本算法)动态规划

    编程总结 每每刷完一道题后,其思想和精妙之处没有地方记录,本篇博客用以记录刷题过程中的遇到的算法和技巧 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。 注意你不能在买入股票前卖出股票。 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时...

    2024-02-01 05:02:21
  • 浅显易懂的《C++类和对象》-中篇

    内容充实、概念易懂,C++类和对象中篇,类的6个默认成员函数,轻松掌握。

    2024-02-01 05:01:51
  • 「Active Directory Sec」白银票据和黄金票据

    「Active Directory Sec」白银票据和黄金票据

    白银票据: 即伪造的TGS。当获取需要访问的目标服务器NTLM HASH后,就可以利用Mimikatz伪造TGS,直接去访问目标服务器。此过程不需要KDC的参与。但缺点是只能访问一个服务。黄金票据: ...

    2024-02-01 05:01:44
  • Day3.数据可视化-- 可视化基础

    Day3.数据可视化-- 可视化基础

    可视化主要是以图像来展示数据间的关系,常见的图形种类有折线图,散点图,条形图,直方图,饼图。此外在接下来课程中还会用到箱线图,热力图,蜘蛛图,表示二元变量分布和成对关系的视图。学好可视化...

    2024-02-01 05:01:37
  • C++ 内存分区: 代码区 全局区 栈区 堆区

    C++ 内存分区: 代码区 全局区 栈区 堆区

    1.代码区: 存放函数体的二进制代码,由操作系统进行管理 **2.全局区:**存放全局变量和静态变量以及常量,数据在程序结束后由操作系统释放 存放内容:全局变量、静态变量、常量区(字符串常量和其他常量) **3.栈区:**由编译器分配和释放,存放函数的参数值,局部变量等 **4.堆区:**由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收 ...

    2024-02-01 05:01:10
  • Android中 Bitmap Drawable Paint的获取、转换以及使用

    比如Drawable中有一系列连续的图片,img_0.png, img_1.png, img_2.png ... 如果要动态获取这些图片,通过&quot;R.drawable.img_x&quot;的...

    2024-02-01 05:01:03
  • 【靶场平台】一些免费好用的靶机渗透测试环境

    1、Vulhub: (各种漏洞环境集合,一键搭建漏洞测试靶场) https://vulhub.org/(在线版) https://github.com/vulhub/vulhub(离线版) 2、Vul...

    2024-02-01 05:00:55
  • Servlet的自动加载

    Servlet的自动加载

    本文阐述了Servlet中与自动加载相关的知识点,并展示了怎样通过设置loadOnStartup属性将自定义Servlet设定为自动加载。

    2024-02-01 05:00:27
  • STM32单片机-CorTexM3位带操作的理解

    STM32单片机-CorTexM3位带操作的理解

    STM32单片机-CorTexM3位带操作的理解

    2024-02-01 05:00:21
  • 测试人员要掌握的基本的SQL语句

    测试人员要掌握的基本的SQL语句

    目录  一、DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)  二、DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)  三、DCL—数据控制语言(GRANT,REVOKE) 四、下半部分内容(主要是PL/<span class="t_tag" onclick="function onclick(){tagshow(event)}"

    2024-02-01 05:00:15