解决办法: 使用related_name属性定义名称(related_name是关联对象反向引用描述符)。...用处就是: 通过AppleLevel可以得到引用自身的Apple对象。...例如, 通过origin_level引用AppleLevel 中id为12的Apple的所有对象 AppleLevel.object.get(id=12).origin_level_appleset.objects.all...() 通过new_level引用AppleLevel 中id为12的Apple的所有对象 AppleLevel.object.get(id=12).new_level_appleset.objects.all...() 以上这篇Django 解决model 反向引用中的related_name问题就是小编分享给大家的全部内容了,希望能给大家一个参考。
> 说明1:由于员工与部门之间存在多对一外键关联,所以也能通过部门反向查询该部门的员工(从一对多关系中“一”的一方查询“多”的一方),反向查询属性默认的名字是类名小写_set(如上面例子中的emp_set...),当然也可以在创建模型时通过ForeingKey的related_name属性指定反向查询属性的名字。...如果不希望执行反向查询可以将related_name属性设置为'+'或以'+'开头的字符串。...说明2:查询多个对象的时候返回的是QuerySet对象,QuerySet使用了惰性查询,即在创建QuerySet对象的过程中不涉及任何数据库活动,等真正用到对象时(求值QuerySet)才向数据库发送SQL...related_name:用于获取关联对象的关联管理器对象(反向查询),如果不允许反向,该属性应该被设置为'+',或者以'+'结尾。 to_field:指定关联的字段,默认关联对象的主键字段。
在Django中具体的对应方式为: 类名对应数据库中的表名 类名对应数据库中的表名 类属性对应数据库里的字段 类实例对应数据库表里的一行数据 类实例对象的属性对应这行中的字段的值 一.数据库的连接 Django...2.QuerySet对象 查询的结果集就是一个QuerySet对象 QuerySet对象就像是一个列表,列表存储着查询出的结果,可以迭代,可以切片 Django中QuerySet对象是惰性的,即你得到这个对象的时候并没有真正的在数据库中执行...SQL语句,只有用到了QuerySet对象中的数据才会执行SQL语句 想判断QuerySet对象中是否有数据,若写成 if obj: 仍然会执行SQL语句,若使用 if obj.exists(): 就可以避免这种问题...QuerySet对象的使用是有cache缓存的,即遍历第二次QuerySet对象的时候数据是从缓存中拿的,不会执行SQL语句 如果QuerySet对象数据量特别大,遍历时为了避免占用大量cache空间,...__iendswith 不区分大小写 等等 5.聚合查询aggregate 聚合查询是对QuerySet对象进行计算得到一个结果值作为字典中的值放到一个字典中 这里先引入一些聚合方法 from django.db.models
manager类,而不是自定义QuerySet类,一般的我们没有自定义QuerySet类的必要;django.db.models模块中的Model类,我们定义表的model时,就是继承它,它的功能很强大...'Beatles Blog') #限定外键表的字段 #下面是反向连接,不过要注意,这里不是entry_set,entry_set是Blog instance的一个属性,代表某个Blog object...#的关联的所有entry,而QuerySet的方法中反向连接是直接用model的小写,不要把两者搞混。...OneToOne的关系也是这样关联查询,可以看到,Django对OneToOne、OneToMany、ManyToMany关联查询及其反向关联查询提供了相同的方式,真是牛逼啊。...=F('blog__name')) 2.4.2 Q类(对应and/or/not) 如果有or等逻辑关系呢,那就用Q类,filter中的条件可以是Q对象与非Q查询混和使用,但不建议这样做,因为混和查询时Q
作者详细模型:把作者的详情放到详情表,包含性别,email地址和出生日期,作者详情模型和作者模型之间是一对一的关系(one-to-one)(类似于每个人和他的身份证之间的关系),在大多数情况下我们没有必要将他们拆分成两张表...并提供了一个简介漂亮的定义数据库字段的语法。 每个模型相当于单个数据库表(多对多关系例外,会多生成一张关系表),每个属性也是这个表中的字段。...注意: 第二种方式修改不能用get的原因是:update是QuerySet对象的方法,get返回的是一个model对象,它没有update方法,而filter返回的是一个QuerySet对象(filter...) #因为一对多的关系所以ret1.publisher是一个对象,而不是一个queryset集合 # 反向查找 ret2=models.Publish.objects.last()...此时Django为我们提供了F和Q查询: # F 使用查询条件的值,专门取对象中某列值的操作 # from django.db.models import F # models.Tb1
wife = Wife.objects.get(name='王夫人') print(wife.name, '的老公是', wife.author.name) 反向查询 通过反向关联属性查询 反向关联属性为实例对象....引用类名(小写),如作家的反向引用为作家对象.wife 当反向引用不存在时,则会触发异常 # 通过 author.wife 关联属性 找 wife,如果没有对应的wife则触发异常 author1 =...'还没有妻子') 一对多映射 一对多是表示现实事物间存在的一对多的对应关系。...的出版社是:', abook.publisher.name) 通过 Publisher 查询 对应的所有的 Book 【反向】 Django会在Publisher中增加一个属性来表示对对应的Book们的查询引用...获取book对应的作者中年龄大于80岁的作者的信息 通过 Author 查询对应的所有的 Book【反向】 Django 会生成一个反向属性 book_set 用于表示对对应的 book 的查询对象相关操作
Django的数据模型的建立过程很简单,就是继承django.db.models中的Model类,然后给它增加属性。每一个属性可以对应关系数据库中的一个字段。...上面的name属性,就对应了生成的myapp_person表中名为"name"的一列。...关系 Django中的一对一、多对一、多对多关系可以通过下面方式表达: from django.db import models class Company(models.Model): name...需要注意的是,在Django ORM中,只能通过ForeignKey来定义多对一关系,不能显示地定义一对多关系。但你可以使用模型对象的*_set语法来反向调用多对一关系。...此外,多对多关系也可以用类似的方式反向调用,比如: group.customer_set 此外,你还可以在模型中加入related_name参数,从而在反省调用时,改用"*_set"之外的其他名称,比如
(Count('book')) 返回的QuerySet的每个publisher都会带一个属性book_count。...但是第一个查询的注解包含其该出版商发行的所有图书的总数;而第二个查询的注解只包含出版过好书的出版商的所发行的好书(评分大于3分)总数。在第一个查询中,注解在过滤器之前,所以过滤器对注解没有影响。...=Count('authors')).order_by('num_authors') values() 通常,注解annotate是添加到每一个对象上的,一个执行了注解操作的查询集 QuerySet 所返回的结果中...就不是在原始的 QuerySet 返回结果中对每个对象中添加注解,而是根据定义在 values() 从句中的字段组合对先结果进行唯一的分组,再根据每个分组算出注解值,这个注解值是根据分组中所有的成员计算而得的...对象,然后在每个分组中得到id值的总数。
: Teacher object (3)>]> 说明1:由于老师与学科之间存在多对一外键关联,所以能通过学科反向查询到该学科的老师(从一对多关系中“一”的一方查询“多”的一方),反向查询属性默认的名字是类名小写..._set(如上面例子中的teacher_set),当然也可以在创建模型时通过ForeingKey的related_name属性指定反向查询属性的名字。...如果不希望执行反向查询可以将related_name属性设置为’+‘或者以’+'开头的字符串。...说明2:ORM查询多个对象时会返回QuerySet对象,QuerySet使用了惰性查询,即在创建QuerySet对象的过程中不涉及任何数据库活动,等真正用到对象时(对QuerySet求值)才向数据库发送...说明3:如果希望更新多条数据,不用先逐一获取模型对象再修改对象属性,可以直接使用QuerySet对象的update()方法一次性更新多条数据。
在了解了Django提供的模型管理平台之后,我们来看看如何从代码层面完成对模型的CRUD(Create / Read / Update / Delete)操作。...>]> 说明1:由于员工与部门之间存在多对一外键关联,所以也能通过部门反向查询该部门的员工(从一对多关系中“一”的一方查询“多”的一方),反向查询属性默认的名字是类名小写_set(如上面例子中的emp_set...),当然也可以在创建模型时通过ForeingKey的related_name属性指定反向查询属性的名字。...如果不希望执行反向查询可以将related_name属性设置为'+'或以'+'开头的字符串。...说明2:查询多个对象的时候返回的是QuerySet对象,QuerySet使用了惰性查询,即在创建QuerySet对象的过程中不涉及任何数据库活动,等真正用到对象时(求值QuerySet)才向数据库发送SQL
与 entry 相关联,Django 会认为它没有 name 属性,而不会因为不存在 author 抛出异常。...Django 也提供反向获取关联对象的 API,就是由从被关联的对象得到其定义关系的主对象。...一对一关系 相对于多对一关系而言,一对一关系不是非常简单的。如果你在 model 中定义了一个 OneToOneField 关系,那么你就可以用这个字段的名称做为属性来访问其所关联的对象。...和你定义正向关联所用的方式一样,类的实例也可以赋予逆向关联方系: e.entrydetail = ed 关系中的反向连接是如何做到的? 其他对象关系的映射(ORM)需要你在关联双方都定义关系。...任何一个 model 在第一次调用时,Django 就会遍历所有的 INSTALLED_APPS 的所有 models,并且在内存中创建中必要的反向连接。
(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。...中的orm的时候,我们可以把一对多,多对多,分为正向和反向查找两种方式。...__关联表字段 通过对象的形式反向跨表:小写表名_set().all() 1对多 如果A表的1条记录对应B表中N条记录成立,两表之间就是1对多关系;在1对多关系中 A表就是主表,B表为子表...='xxxx') #回复ID 多对多 多对多关系表 数据查找思路 找到该对象 通过该对象 反向操作 找到第三张关系表 通过第三张关系表 正向操作 找到 和该对象有关系对象 总结(只要对象1和对象...2 中间有关系表建立了关系; 对象1反向操作 到关系表 ,关系表正向操作到对象2,反之亦然
一、django ORM简介 O(objects):类和对象。R(Relation):关系,关系数据库中的表格。M(Mapping):映射。...Django ORM框架的功能: 建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库。 根据设计的模型类生成数据库中的表格。 通过方便的配置就可以进行数据库的切换。...3.2使用update方法直接设置对就的属性 Publish.objects.filter(id=2).update(name="北京出版社") 注意:update()是QuerySet对象的一个方法...类中的ordering属性对QuerySet中的对象进行排序 Student.objects.filter(school="阳关小学").order_by('-age', 'name') ...每个字典表示一个对象,键对应于模型对象的属性名称。
查找的参数(**kwargs)应该满足下文字段查找中的格式。多个参数之间是和AND的关系。...,根据模型的Meta类中的ordering属性对QuerySet中的对象进行排序 Entry.objects.filter(pub_date__year=2005).order_by('-pub_date...每个字典表示一个对象,键对应于模型对象的属性名称。...可以通过ManyToManyField、ForeignKey 和 OneToOneFiel 属性反向引用关联的模型的字段: >>> Blog.objects.values('name', 'entry_...不适用于多表继承场景中的子模型。 如果模型的主键是AutoField,则不会像save()那样检索并设置主键属性,除非数据库后端支持。 不适用于多对多关系。
,values返回的是一个字典序列 # count(): 返回数据库中匹配查询(QuerySet)的对象数量。...) #因为一对多的关系所以ret1.publisher是一个对象,而不是一个queryset集合 # 反向查找 ret2=models.Publish.objects.last()...# 拿到没有外键字段的表对象 print(ret2.name) print(ret2.city) #如何拿到与它绑定的Book对象呢?...#一对多和多对多在这里用法没区别 # 反向查找(条件)----在没有外键的表中,查找与其关联表的字段信息 #反向查找之一对多: ret8=models.Publisher.objects.filter...F查询和Q查询 F 使用查询条件的值,专门取对象中某列值的操作 Q 查询提供了或操作 # from django.db.models import F # models.Tb1
ORM 映射关系: 表名 类名 字段 属性 表记录 类实例对象 创建表(建立模型) 实例:我们来假定下面这些概念...在上面的例子中,我们并没有传入blog参数给create()。Django会明白新的 Entry对象blog 应该添加到b中。 remove(obj1[, obj2, ...])...对查询结果反向排序 distinct(): 从返回结果中剔除重复纪录 count(): 返回数据库中匹配查询(QuerySet)...注意: 第二种方式修改不能用get的原因是:update是QuerySet对象的方法,get返回的是一个model对象,它没有update方法,而filter返回的是一个QuerySet对象(filter...(例如,遍历 QuerySet,在每个对象上调用 delete()方法),而不是使用 QuerySet 中的 delete()方法。
文件中,然后删掉不要的 此时,访问网页时,url地址需要加上/app01/ 反向解析 访问网页的url由于业务变化等关系可能会变动,此时引用他们的地方就会面临更改的问题。...在URL控制器(project/urls.py)中,给匹配规则起个别名可以解决这个问题,这就叫做反向解析 在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查: 在模板中...] print(book) # model对象 python get(kwargs): 返回与所给筛选条件相匹配的对象**,返回结果有且只有一个, 如果符合筛选条件的对象超过一个或者没有都会抛出错误...() print(ret) count(): 返回数据库中匹配查询(QuerySet)的对象数量。...---- 注意了: Book里这个author只是这个类的属性,在最终生成的数据库表中并没有这个字段,只是用于orm生成关系表 最终会生成四张表 app01_author #
:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 类名对应------》数据库中的表名 类属性对应...---------》数据库里的字段 类实例对应---------》数据库表里的一行数据 obj.id obj.name.....类实例对象的属性 Django orm的优势: Django的orm操作本质上会根据对接的数据库引擎...) 多对多关系表 数据查找思路 1、找到该对象2.通过该对象 反向操作 找到第三张关系表3.通过第三张关系表 正向操作 找到 和该对象有关系对象总结(只要对象1和对象2 中间有关系表建立了关系; 对象...1反向操作 到关系表 ,关系表正向操作到对象2,反之亦然 2、第3张关系表不用写(m=models.ManyToManyField(' 要关联的表') 自动生成 ) ?...此时Django为我们提供了F和Q查询: 1、F 可以获取对象中的字段的属性(列),并对其进行操作; from django.db.models import F,Q #F 可以获取对象中的字段的属性
领取专属 10元无门槛券
手把手带您无忧上云