一、一般操作

  1. from django.db import models
  2. import datetime
  3.  
  4. # Create your models here.
  5.  
  6. class Author(models.Model):
  7. id=models.AutoField(primary_key=True)
  8. name=models.CharField(max_length=20)
  9. # 以下是测试字段
  10. numtest=models.IntegerField()
  11. datetest=models.DateField(null=False,default=datetime.datetime(year=2000,month=1,day=1))
  12.  
  13. def __str__(self):
  14. return "名字:%s,数字:%d,日期:%s" %(self.name,int(self.numtest),self.datetest)
  15. # 设置创建的表名
  16. class Meta:
  17. 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

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

二、单表查询之双下划线

模型类

  1. class Student(models.Model):
  2. id=models.AutoField(primary_key=True)
  3. name=models.CharField(max_length=10)
  4. age=models.IntegerField(default=0)
  5.  
  6. classes=models.ForeignKey(to="Classes",on_delete=models.CASCADE)
  7.  
  8. class Meta:
  9. db_table="stu"
  10.  
  11. def __str__(self):
  12. return "{}:{}".format(self.id,self.name)
  13.  
  14. class Classes(models.Model):
  15. id=models.AutoField(primary_key=True)
  16. cls=models.CharField(max_length=20)
  17.  
  18. class Meta:
  19. db_table="cls"
  20.  
  21. def __str__(self):
  22. 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)反向查询之方法二

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

四、多对多表的相关操作

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

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

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

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

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

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

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

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

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

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

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

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

外键的反向操作

更新了模型类

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Author(models.Model):
  6. id=models.AutoField(primary_key=True)
  7. name=models.CharField(max_length=10)
  8. book=models.ManyToManyField(to="Books")
  9.  
  10. class Books(models.Model):
  11. id=models.AutoField(primary_key=True)
  12. name=models.CharField(max_length=20)
  13.  
  14. book_publisher=models.ForeignKey(
  15. to="Publisher",
  16. null=True,
  17. on_delete=models.CASCADE,
  18. related_name="publisher_book"
  19. )
  20.  
  21. class Publisher(models.Model):
  22. id=models.AutoField(primary_key=True)
  23. name=models.CharField(max_length=20)
  1. # 外键的反向操作
  2. # 查询出版社下的所有图书 出版社:多 图书:一 外键添加在图书类中
  3. get_publisher=models.Publisher.objects.get(id=1)
  4. get_books=get_publisher.publisher_book.all()
  5. books_list=[]
  6. for b in get_books:
  7. books_list.append(b.name)
  8. print(books_list )
  1. # 删除出版社id=1下的所有图书(相当于将外键的指向删除)
  2. get_publisher=models.Publisher.objects.get(id=1)
  3. get_publisher.publisher_book.clear()

Django框架之ORM的相关操作(一)的更多相关文章

  1. Django框架之ORM的相关操作之分页(六)

    分页是每个项目必不可少要写的一个功能,该篇文章就将记录一下使用ORM写分页的过程. 假设我们的数据库里面需要显示一些数据,而这个表中的数据大约有几千条数据,那么我们不可能将所有的数据都显示出来,那么就 ...

  2. Django框架之ORM的相关操作之多对多三种方式(五)

    在之前的博客中已经讲述了使用ORM的多对多关系表,现在进行总结一下: 1.ORM自动帮助我们创建第三张表 2.手动创建第三张表,第三张表使用ForeignKey指向其他的两张表关联起来 3.手动创建第 ...

  3. Django框架之ORM的相关操作之一对一关系(四)

    ORM中一对一在当一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁,那么就把不常用的字段单独拿出来做成一张表,然后通过一对一进行关联起来.举个例子:在我们登录某个账户的时候,一般会显示 ...

  4. Django框架之ORM的相关操作(二)

    模型类: class Commongity(models.Model): id=models.AutoField(primary_key=True) name=models.CharField(max ...

  5. Django框架06 /orm多表操作

    Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...

  6. Django框架05 /orm单表操作

    Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...

  7. Django框架之ORM对表结构操作

    ORM的优点:(1)简单,不用自己写SQL语句 (2)开发效率高 ORM的缺点:对于不同的人写的代码,执行效率有差别 ORM的对应关系: 类  ---------->  数据表 对象------ ...

  8. django框架基础-ORM跨表操作-长期维护

    ###############    一对一跨表查询    ################ import os if __name__ == '__main__': os.environ.setde ...

  9. django框架基础-ORM单表操作-长期维护

    ###############    单表操作-添加数据    ################ import os if __name__ == '__main__': os.environ.set ...

随机推荐

  1. javascript当中的构造函数的用法

    5)构造函数的用法: 例 3.5.1 <head>    <meta http-equiv="content-type" content="text/h ...

  2. Learning to See in the Dark论文阅读笔记

    这是一篇图像增强的论文,作者创建了一个数据集合,和以往的问题不同,作者的创建的see in the dark(SID)数据集合是在极其暗的光照下拍摄的,这个点可以作为一个很大的contribution ...

  3. 数据库ETL同步 cdc开启,Git同步url添加用户名密码

    添加双主键 alter table TChargeRecordMainNew add constraint pk_name primary key (任务编码,序号) ---------------- ...

  4. Autocorrelation in Time Series Data

    Why Time Series Data Is Unique A time series is a series of data points indexed in time. The fact th ...

  5. Java-POJ1009-Edge Detection(未完成,有C++代码)

    RLE编码,还不会,先搬运一下大佬的代码,理解之后再用Java自己实现 #include <map> #include <vector> #include <cstdli ...

  6. AcWing 338. 计数问题

    #include <iostream> #include <algorithm> #include <vector> using namespace std; ; ...

  7. 用js实现鼠标点击爱心特效

    效果如图以下是代码 <script> !function(e, t, a) { function r() { for (var e = 0; e < s.length; e++) s ...

  8. linux 内存,cpu占用最高进程查询

    1. 可以使用一下命令查使用内存最多的10个进程 ps -aux | sort -k4nr | head -n 10 2. 可以使用一下命令查使用CPU最多的10个进程 ps -aux | sort ...

  9. stm32f103中freertos的tasks基本使用案例及备忘

    基本实例   freetos的在stm32中使用踩了一些坑,事情做完了,就 做个备忘,希望能给后面的人一些借鉴. 先给出一个实际的例子吧. 启动代码 void task_create(void) { ...

  10. C++泛型算法总结

    1 accumulate(b,e,T) 累和(基础和为T) 注意T的类型必须和序列中元素类型相同,如double序列后面的T就必须是0.0,如果是0就会把序列中的数当成int进行求和 2 count( ...