多表查询是模型层的重要功能之一, Django提供了一套基于关联字段独特的解决方案....默认地,Django 使用关联对象的主键。...提供了一种使用双下划线__的查询语法: >>> Entry.objects.filter(blog__name='Beatles Blog') 反向查询 被索引的关系模型可以访问所有参照它的模型的实例,...如Entry.blog作为Blog的外键,默认情况下Blog.entry_set是包含所有参照Blog的Entry示例的查询集,可以使用查询集API取出相应的实例。...使用ManyToManyField查询 多对多关系和ForeignKey具有相似的API.
进入到django自带的related.py中,可以看到 1.ForeignKey 初始化的参数有: to, on_delete, related_name=None, related_query_name...models.Model): book = models.ForeignKey(to='Author',on_delete=models.CASCADE,to_field='id') to:被关联表的名称...on_delete:删除带有外键的信息时,定义了删除的操作: CASCADE:删除作者信息一并删除作者名下的所有书的信息; PROTECT:删除作者的信息时,采取保护机制,抛出错误:即不删除Books...的内容; SET_NULL:只有当null=True才将关联的内容置空; SET_DEFAULT:设置为默认值; SET( ):括号里可以是函数,设置为自己定义的东西; DO_NOTHING:字面的意思...,啥也不干,你删除你的干我毛线关系; to_field:被关联的字段,一般是主键,也可以是值唯一的字段 2.OneToOne 初始化参数有: to, on_delete, to_field=None,
True) create_time = models.DateField(verbose_name='创建时间', auto_now=True) product = models.ManyToManyField...models.TextField(verbose_name='备注', null=True, blank=True) 警告信息 (fields.W340) null has no effect on ManyToManyField...解决办法 这只是一个小小的警告,可以不用处理,如果觉得碍眼,可以把product字段的null=True移除 移除后就是这样的: product = models.ManyToManyField(Product
Django的filter查询 name__contains表示精确大小写的模糊查询 使用name__icontains表示忽略大小写 year_count = DownloadFile.objects.filter
由于想要做收藏夹的功能,所以希望能够一次性查询出所有id的对象,查看文档,找到了如下方法 pk是primary key的缩写,顾名思义pk_in就是primary key在某一个范围内,具体操作(以自带的...User为例): User.objects.filter(pk__in=[1,2,3]) 这样就可以去除id为1,2,3的User的对象了,很方便 注意是两个下划线 另外,还要pk__gt和pl_lt...pk__lt=10) 意味着将要得到pk小于10的对象 补充知识:Django 比较同一个model中的两个字段,进行条件过滤 django orm中怎么样比较同一个模型中的两个字段来过滤记录呢?...select *from contracts where contract_stop_time<end_time 这里要是用db模块中的F 库才行 F object from django.db.models...以上这篇Django:使用filter的pk进行多值查询操作就是小编分享给大家的全部内容了,希望能给大家一个参考。
大家好,又见面了,我是你们的朋友全栈君。...= 5 如果我们需要局部配置则在类视图中访问使用pagination_class = MyPageNumberPagination即可 如果是全局配置,则在settings.py文件中配置如下: REST_FRAMEWORK...page=2,代表访问第二页的数据,数据的条数默认为page_size的值 比如http://127.0.0.1:8000/api/cars/?...limit=10代表访问的数据最多展示10条,如果你limit的值>max_limit,那么还是按照max_limit的值来展示数据的条数 比如http://127.0.0.1/api/cars/?...= 10 page_size_query_param = "page_size" max_page_size = 20 ordering = '-price' 如果我们视图中使用了排序过滤
大家好,又见面了,我是你们的朋友全栈君。...from django.shortcuts import render from .models import Book # Create your views here. def index(req)...Book.objects.filter(name__contains="python") return render(req,"index.html",{"books":books}) name__后面有很多模糊查询的方法...同理,price字段支持大于等于 小于等模糊查询,日期支持查询某月的某年的等查询方法。
字段参数: - to:设置要关联的表 - to_field:设置要关联的表的字段 - related_name:反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。...(反向查询)时,我们会这么写: models.Classes.objects.first().students.all() - related_query_name:反向查询操作时,使用的连接前缀,用于替换表名...self", symmetrical=False) 此时,person对象现在就可以使用person_set属性进行反向查询。...through:在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。...,就要使用第三种方式。
建表 需求(1) 需求(2) 总结 value()函数,获取列表 value()函数,获取元组 总结 建表 目前有两个表,一个用户表,一个用户类型表,一个用户对应一类型,但是一个类型下面有好多的用户...外键是在用户表里面 需求(1) 根据查询出来的用户,获取他的用户类型,这个就是多表查询,实现代码是 先查询出用户,直接根据外键字段获取他的用户类型 需求(2) 根据一个用户类型,查询他下面的所有的用户...其实有一个隐含的字段,写法是 总结 value()函数,获取列表 value()函数,获取元组 总结 以上方法 字典和元组是不可以跨表查询的 以下的写法是可以跨表的
多对一关系 多对多关系 一对一关系 多对一 django是使用django.db.models.ForeignKey 定义多对一关系 ForeignKey需要一个位置参数来指定本Model关联的Model...正向查询( ForeignKey 所在的模型查询关联的模型) car = Car.objects.get(pk=2) car.manufacturer #返回一条Manufacturer 对象 反向查询...默认情况下,这个管理器的名字为foo_set,其中foo 是源模型的小写名称。该管理器返回的查询集可以用上一节提到的方式进行过滤和操作。...clear() #从关联的对象集中删除所有的对象 多对多 要实现多对多,就要使用django.db.models.ManyToManyField类,和ForeignKey一样,它也有一个位置参数,用来指定和它关联的...(Group) 建议以被关联模型名称的复数形式做为 ManyToManyField 的名字 在哪个模型中设置 ManyToManyField 并不重要,在两个模型中任选一个即可——不要在两个模型中都设置
数据库的查询需要使用管理器对象进行 通过mymodel.objects管理器方法调用查询对象 方法 说明 all() 查询全部记录,返回QuerySet查询对象 get() 查询符合条件的单一记录 filter...() 查询符合条件的多条记录 exclude() 查询符合条件外的全部记录 all()方法 ---- 使用方法:Asset.objects.all() from monitor.models import...,内部存放的是元组 会将查询出来的数据封装到元组中,在封装到查询集合QuerySet中 >>> a = Asset.objects.values_list("create_date") >>> a...("title").order_by('-price') >>> print(a.query) # 可以使用这种方式查看发送给MySQL的查询语句 filter() ---- 用法:Asset.objects.filter...="admin",system="Linux") for i in info: print("查询结果",i.create_date) 查询谓词 定义:做更灵活的条件查询时候需要使用查询谓词 每一个查询谓词是一个独立的查询功能
1.准备数据表: from django.db import models class City(models.Model): name=models.CharField(max_length=32)...models.Model): nid=models.AutoField(primary_key=True) title=models.CharField(max_length=32) author=models.ManyToManyField...#1.跨表多对多查询 #模型关系 城市 <-- 作者 <-- 书 #查询haimingwei写的所有书籍 #基于对象-->反向查询(按表名_set) (返回...').values('city__name') #3.跨表一对一查询 #模型关系 作者 <-- 作者信息 #查询手机号为123的作者 #基于对象 --> 正向查询...'telephone')) #分组查询 -->不管是单表还是跨表一律都是基于queryset的查询 #模型关系 城市 <-- 作者 <-- 书 #查询每个作者写的书籍总数
offset子句 注意:不支持负数索引 使用下标后返回一个新的查询集,不会立即执行查询 如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常...,[0:1].get()引发DoesNotExist异常 查询集的缓存 每个查询集都包含一个缓存来最小化对数据库的访问 在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询,django会将查询的结果存在查询集的缓存中...,但是如果这部分不在缓存中,那么接下来查询返回的记录将不会被缓存,这意味着使用索引来限制查询集将不会填充缓存,如果这部分数据已经被缓存,则直接使用缓存中的数据 字段查询 实现where子名,作为方法filter...')) django支持对F()对象使用算数运算 list.filter(bread__gte=F('bcommet') * 2) F()对象中还可以写作“模型类__列名”进行关联查询 list.filter...,会合并为And进行 需要进行or查询,使用Q()对象 Q对象(django.db.models.Q)用于封装一组关键字参数,这些关键字参数与“比较运算符”中的相同 from django.db.models
youdatetimcolumn__lt=start) 4、lte:小于等于 a=yourobject.objects .filter(youdatetimcolumn__lte=start) 5、range:查询时间段...= datetime.date(2005, 3, 31) Entry.objects.filter(pub_date__range=(start_date, end_date)) 6、year:查询某年...Entry.objects.filter(pub_date__year=2005) 7、month:查询某月 Entry.objects.filter(pub_date__month=12)...Entry.objects.filter(pub_date__day=3) 9、week_day:星期几 Entry.objects.filter(pub_date__week_day=2) 10、获取今天的日期...,日期格式为yyyy-MM-dd from django.utils.timezone import now, timedelta date = now().date() + timedelta(days
分组查询、F查询和Q查询 分组查询 统计每个出版社出版的书籍的平均价格 第一种方式 obj = models.Book.objects.values('publishs_id').annotate(...5,decimal_places=2) #decimal(16,2) publishs=models.ForeignKey(to="Publish") authors=models.ManyToManyField...当一个操作符在两个Q 对象上使用时,它产生一个新的Q 对象。 你可以组合& 和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。...同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询: bookList=Book.objects.filter(Q(authors__name="yuan") & ~Q(publishDate...所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。
Django 会提供一套自动生成的用于数据库访问的API;详见执行查询。...字段名称不可以包含连续多个下划线,因为这与 Django 查询时所用的筛选条件语法相冲突。...这是因为 Django 会对每个 SQL 查询的数据库名称和列名称做重编码,至于如何编码视你所用的数据库而定。...查询集只返回请求时所使用的 model (Querysets still return the model that was requested) 无论你何时查询 User 对象,Django 都不会返回...针对 User 对象的查询集只返回 User 对象。代理对象的精要就在于依赖原始 User 的代码仅对它自己有效,而你自己的代码就使用你扩展的内容。
相反地,使用ForeignKey, 反向关联后会返回QuerySet。...relate_name, 则是对方类名的小写_set [<Car2: Mazda ] 补充知识:Django ForeignKey,ManyToManyField和OneToOneField的辨析 导引...通过一个限制对字段信息的某一可能选项进行约束,可以通过字典,函数或者查询值来设置 related_name 可以指定关联的类在本类中的名称,通过这一参数可以用两个字段名引用同一个类,通过这个名称父类可以取得子类的值...ManyToManyField类有两个经常使用的参数:through和through_fields,通过这两个参数可以十分方便地建立中间项的关联,如示例代码所示: from django.db import...ManyToManyField,其为这一字段建立一个单独的属性,而是设定symmetrical属性为True,若期望使用此类迭代关系,可以手动设置其为False through 如上所示,用于设置中间项的名字
# 而对于标签来说,一篇文章可以有多个标签,同一个标签下也可能有多篇文章,所以我们使用 # ManyToManyField,表明这是多对多的关联关系。...而对于标签来说,一篇文章可以有多个标签,同一个标签下也可能有多篇文章,所以我们使用 ManyToManyField,表明这是多对多的关联关系。...当要查询文章属于哪一个分类时,只需要查看其对应的分类 ID 是多少,然后根据这个分类 ID 就可以从分类数据库表中找到该分类的数据。...反之,要查询某个分类下有哪些文章,只需要查看对应该分类 ID 的文章有哪些即可。...详细示例[3]•django ManyToManyField 简介[4]•django ManyToManyField 详细示例[5] References [1] 关于字段类型的介绍: https:/
Django 提供一套自动生成的用于数据库访问的API;详见执行查询。...中介模型有一些限制: 中介模型必须有且只有一个外键到源模型(上面例子中的Group),或者你必须使用ManyToManyField.through_fields 显式指定Django 应该使用的外键。...由于Django 查询语法的工作方式,字段名称中连续的下划线不能超过一个。...SQL 的保留字例如join、where 和select,可以用作模型的字段名,因为Django 会对底层的SQL 查询语句中的数据库表名和列名进行转义。 它根据你的数据库引擎使用不同的引用语法。...查询集始终返回请求的模型 也就是说,没有办法让DJango在查询Person对象时返回MyPerson对象。Person 对象的查询集会返回相同类型的对象。
to 设置要关联的表 to_field 设置要关联的表的字段 related_name 反向查询时,使用的字段名,用于代替原反向查询时的'表名_set'。...to 设置要关联的表 related_name 反向查询时,使用的字段名,用于代替原反向查询时的'表名_set'。 symmetrical 仅用于多对多自关联时,指定内部是否创建反向操作的字段。...("self", symmetrical=False) 此时,person 对象可以使用 person_set 属性进行反向查询。...through 在使用 ManyToManyField 字段时,Django 将自动生成一张表来管理多对多的关联关系。...这样创建的第三张表无法使用 set、add、remove、clear方法来管理对多多关系,需要通过第三张表来进行增、删、改,查询一样。
领取专属 10元无门槛券
手把手带您无忧上云