首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

具有两个外键字段指向同一外部模型的模型的Django聚合?

在Django中,具有两个外键字段指向同一外部模型的模型的聚合可以通过使用django.db.models.Q对象和django.db.models.aggregates模块中的聚合函数来实现。

首先,让我们假设有一个模型ModelA,它具有两个外键字段field1field2,它们都指向同一个外部模型ModelB。我们的目标是对ModelA进行聚合操作。

代码语言:txt
复制
from django.db.models import Q, Count
from myapp.models import ModelA

# 使用Q对象创建两个外键字段的查询条件
query = Q(field1__isnull=False) | Q(field2__isnull=False)

# 使用聚合函数对满足查询条件的ModelA对象进行聚合操作
aggregation = ModelA.objects.filter(query).aggregate(
    total_count=Count('id'),
    distinct_field1_count=Count('field1', distinct=True),
    distinct_field2_count=Count('field2', distinct=True)
)

上述代码中,我们使用Q对象创建了一个查询条件,该条件表示field1field2字段不为空。然后,我们使用filter()方法将该查询条件应用于ModelA对象,获取满足条件的对象集合。最后,我们使用aggregate()方法对满足条件的ModelA对象进行聚合操作。

在聚合操作中,我们使用Count函数来计算总数和去重计数。Count函数接受一个字段名作为参数,并使用distinct=True参数来进行去重计数。

聚合操作的结果将以字典形式返回,包含了总数和去重计数的值。你可以根据需要自定义聚合操作的字段和计算方式。

这是一个使用Django进行模型聚合操作的示例。对于更复杂的聚合需求,你可以参考Django官方文档中关于聚合操作的详细说明:Django官方文档 - 聚合

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

django模型中有关系表删除相关设置

0904自我总结 django模型中有关系表删除相关设置 一.一对一 例如有Author、AuthorDetail两表 author = models.OneToOneField(to='Author...AuthorDetail表中:作者删除详情删除,详情删除作者保留 2)作者找详情用 related_name(detail),详情找作者用 字段(author) 3)db_constraint...Book表中(多一方):出版社删除书不动,书删除没有任何影响 2)出版社找书用 related_name(books),书找出版社 字段(publish) 3)db_constraint...断开表关联,on_delete规定逻辑关联删除动作,models.DO_NOTHING关联无动作 三.以外字段关联 1)断关联,删除关联表记录,键值置空 db_constraint=False,...:出版社删除或书删除彼此不影响,但关系表一定级联删除 2)正向找 字段,反向找 字段related_name 3)db_constraint断开表关联,on_delete不存在(不设置,本质在第三张表中设置

3K20

使用Django实现把两个模型数据聚合在一起

Django中想要把模型聚合得到想要数据可以用F对象。 比如有模型类A和B,A和B之间有关联在一起,A是子表,B是父表(反过来没试过。。...这样操作结果就是可以查询到userid为3且模型类A字段bookid等于模型类B字段bid集合数据了。 F对象是可以比较两个关联模型字段数据。...models.Model): # 写一个方法,定义在管理页面上能够显示字段字段 # grade为Students模型检表,level为Grades模型检表,那么为Level模型字段...添加是'模型字段' # 如果是需要遵循这样语法:本表字段__(双下划线)检表字段检表字段__最终表要显示字段。...以上这篇使用Django实现把两个模型数据聚合在一起就是小编分享给大家全部内容了,希望能给大家一个参考。

1.4K20

Django之ForeignKey和ManyToManyField多表查询

多表查询是模型重要功能之一, Django提供了一套基于关联字段独特解决方案....被索引关系模型可以访问所有参照它模型实例,如Entry.blog作为Blog,默认情况下Blog.entry_set是包含所有参照BlogEntry示例查询集,可以使用查询集API取出相应实例...ManyToManyField.through_fields 上文示例中Membership 有两个指向Person (person 和inviter),这使得关联关系含混不清并让Django 不知道使用哪一个...在这种情况下,必须使用through_fields 明确指定Django 应该使用哪些 through_fields 接收一个二元组('field1', 'field2'),其中field1 为指向定义...ManyToManyField 字段模型键名称(本例中为group),field2 为指向目标模型名称(本例中为person).

1.7K10

06.Django基础五之django模型层(二)多表操作

一 创建模型 表和表之间关系     一对一、多对一、多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加约束和不加约束区别,一对一约束是在一对多约束上加上唯一约束...注意事项: 表名称myapp_modelName,是根据 模型元数据自动生成,也可以覆写为别的名称   id 字段是自动添加 对于字段Django 会在字段名上添加"_id" 来创建数据库中列名...但是我们就不能使用ORM相关方法了,所以我们单纯换成一个其他字段类型,只是单纯存着另外一个关联表主键值是不能使用ORM方法。...名称是聚合标识符,值是计算出来聚合值。名称是按照字段聚合函数名称自动生成出来。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。...F() 实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段值。

2.7K20

Django 模型层之多表操作

Author) def __str__(self): return self.name 注意事项: 1.id字段不写的话会自动添加 2.对于字段,Django会在字段名上添加...要做跨关系查询,就使用两个下划线来连接模型(model)间关联字段名称,知道最终链接到你想要model为止。...名称是聚合标识符,值是计算出来聚合值,名称是按照字段聚合函数名称自动生成出来,如果你想要为聚合值指定一个名称,可以向聚合子句提供一个名字。...Django提供了以下聚合函数 1.expression 引用模型字段一个字符串,或者一个query expression 2.output_field 用来表示返回值model field...,都是将模型字段与常量进行比较,但是,如果想将模型一个字段同一模型另一个字段进行比较该怎么办?

1.3K20

Django聚合Django详细解析以及运用在企业级项目里方法

例如,想计算所有在售图书平均价格。Django查询语法提供了一种描述所有藏书方法。 传递给聚合()参数描述了要计算聚合值。在此示例中,将计算Book模型上价格字段平均值。...到目前为止,我们已经处理了查询模型字段聚合。...但是,有时要聚合值属于所查询模型关联模型。 在聚合函数中指定聚合字段时,Django允许您在筛选相关字段时使用相同双下划线符号。Django将处理需要检索和聚合相关值任何表连接。...它不仅用于,还用于多对多关系。...应用于公共模型字段任何过滤器()(或exclude())都将具有约束被认为是聚合对象效果。 当使用annotate()子句时,过滤器具有约束注释对象计算效果。

2K40

关系数据库设计之(双

通常,关系用来表示领域模型关联关系,这也是最常见使用方法,而本文讨论关系使用与之不同,是在特定场景下对关系使用,这样场景也会在不同应用系统中出现,所以本设计方法应该具有普适性,适用于各数仓模型设计...code 与assoc_code,当数据不发生变化时,两个字段值保持一致,一旦发生code 变更后,旧记录 assoc_code 字段值则与新记录code 保持一致,主要用于数据分组及过滤; 1)...3 总结 双设计有两个关键特点:1)同一存储了两份,一份用于记录历史,而另一份用于响应变化,并提供对外检索和分组能力;2)维度表与事实表之间关联以带有业务特征hash 值进行关联,而不是自增无意义数据进行关联...这样模型设计充分解决数仓数据灵活性,也降低外部系统变化对数仓数据影响。...,或者人肉方式解决,因此,双设计将有效提升数据系统灵活性和可用性,降低对外部系统要求,从而提升开发效率。

1.5K61

Django学习笔记之ORM多表操作

注意事项:  表名称myapp_modelName,是根据 模型元数据自动生成,也可以覆写为别的名称   id 字段是自动添加  对于字段Django 会在字段名上添加"_id" 来创建数据库中列名...字段 ForeignKey 有一个 null=True 设置(它允许接受空值 NULL),你可以赋给它空值 None 。 添加表纪录  操作前先简单录入一些数据: publish表: ?...要做跨关系查询,就使用两个下划线来链接模型(model)间关联字段名称,直到最终链接到你想要model 为止。...名称是聚合标识符,值是计算出来聚合值。名称是按照字段聚合函数名称自动生成出来。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。...如果我们要对两个字段值做比较,那该怎么做呢? Django 提供 F() 来做这样比较。F() 实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段值。

2.8K40

Django ORM 多表操作

目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加) 一对多( ForeignKey) 一对一 (OneToOneFeild) 多对多...ORM 多表操作 表模型 图书表 出版社表 作者表 作者详情表 表关系 一对一:一对一推荐建在查询频率高一方 一对多:字段建在多一方 多对多:字段建在查询频率多一方,在Django第三张表不需要创建...,自动创建 ps:字段不需要写表名_id后面的_id,ORM创建时候自动添加了_id,以及以虚拟字段形式存在 创建模型 '''models.py''' from django.db import...6、若有模型类存在外,创建数据时,要先创建关联模型数据,不然创建包含模型数据时,关联模型数据会找不到 逆向到表模型 插入数据 ps:插入几条数据方便操作 ORM...(常用) 一对多中,设置属性类(多表)中,MySQL 中显示字段名是:属性名_id。

1.7K20

Django框架学习(四)

返回是不满足条件所有数据 order_by是排序,参数是排序字段 aggregate聚合,参数是聚合类,返回是一个字典 count没有参数,返回查询结果数量,返回是一个数字 1.2条件查询 注意...import F 1.4Q对象 用于查询时条件之间逻辑关系 from django.db.models import Q 与& 或| 非~ 1.5聚合 聚合类: from django.db.models...order_by 1.7关联查询 1、查询和指定对象关联数据(重点掌握) 由一查多:一对象.多类名小写__set.all() 由多查一:多对象.属性 2、通过模型类进行关联查询 查图书:一类.objects.get...|filter(多类名__字段__条件=值) 查英雄:多类.objects.filter(属性__字段__条件=值) 2.查询集 注意:对于queryset类对象,可以继续调用之前任何一个查询函数...两大特性: 1、惰性查询:只有在使用查询集中数据时才会进行数据库真正查询操作 2、查询结果缓存:如果使用同一个查询集时,只有在第一次使用查询集时会进行数据库查询操作,然后Django框架就会把查询结果存起来

1.5K41

Django之QuerySet详解

表达式可以是简单值、对模型(或任何关联模型)上字段引用或者聚合表达式(平均值、总和等)。...匿名参数别名将基于聚合函数名称和模型字段生成。 只有引用单个字段聚合表达式才可以使用匿名参数。 其它所有形式都必须用关键字参数。...若要按照另外一个模型字段排序,可以使用查询关联模型语法。即通过字段名称后面跟两个下划线(__),再加上新模型字段名称,直到希望连接模型。...如果指定字段,每个字典将只包含指定字段/值。如果没有指定字段,每个字典将包含数据库表中所有字段和值。...ForeignKey使用SQL约束ON DELETE CASCADE,任何具有指向要删除对象对象将与它们一起被删除。

2.3K20

django 1.8 官方文档翻译: 2-5-4 聚合 (初稿)

名称是按照字段聚合函数名称自动生成出来。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。...在聚合函式中指定聚合字段时,Django 允许你使用同样 双下划线 表示关联关系,然后 Django 在就会处理要读取关联表,并得到关联对象聚合。...和 跨关系查找方法类似,作用在你所查询模型关联模型或者字段聚合和注解可以遍历”反转”关系。...例如,我们可以查询所有出版商,并注上它们一共出了多少本书(注意我们如何用 ‘book’指定Publisher -> Book 反转关系): >>> from django.db.models import...这意味着如果你有两个作者同名,那么他们原本各自查询结果将被合并到同一个结果中;两个作者所有评分都将被计算为一个平均分。

1.6K30

Django——model基础

myapp_modelName,是根据 模型元数据自动生成,也可以覆写为别的名称   2、id 字段是自动添加 3、对于字段Django 会在字段名上添加"_id" 来创建数据库中列名...6、字段 ForeignKey 有一个 null=True 设置(它允许接受空值 NULL),你可以赋给它空值 None 。...@163.com") 字段 ?...名称是聚合标识符,值是计算出来聚合值。名称是按照字段聚合函数名称自动生成出来。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。 ?...如果我们要对两个字段值做比较,那该怎么做呢? Django 提供 F() 来做这样比较。F() 实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段值。 ?

1.1K100

Django 模型查询2.3

):一个对象构成一个字典,然后构成一个列表返回 写法: filter(1=值1,2=值2) 等价于 filter(1=值1).filter(2=值2) 返回单个值方法 get():返回单个满足条件对象...()、exclude()、get()参数 语法:属性名称__比较运算符=值 表示两个下划线,左侧是属性名称,右侧是比较类型 对于,使用“属性名_id”表示原始值 转义:like语句中使用了%... 注:可以没有__部分,表示等于,结果同inner join 可返向使用,即在关联两个模型中都可以使用 filter(heroinfo_ _hcontent_ _contains...='八') 查询快捷方式:pk,pk表示primary key,默认主键是id filter(pk__lt=6) 聚合函数 使用aggregate()函数返回聚合函数值 函数:Avg,Count,...= list.count() F对象 可以使用模型字段A与字段B进行比较,如果A写在了等号左边,则B出现在等号右边,需要通过F对象构造 list.filter(bread__gte=F('bcommet

2.3K20

【云+社区年度正文】Django从入门到精通No.2----模型

必填参数primary_key=True,则成为数据库主键,无该字段时,django自动创建,一个model不能有两个字段。...1.多对一 因为是关联关系,所以我们必须指定两个类来进行相互操作,这里涉及到一个操作,即ForeignKey字段,而且要定义在多一方。...,必须设中间关联表,关联表设独立主键,并引入两个“多”头主键作为关联表。...,你可以指定一个中介模型来定义多对多关系,可以将其它字段放在中介模型中,源模型字段使用through参数指向中介模型。...=None # 自定义第三张表时,使用字段用于指定关系表中那些字段做多对多关系表 db_constraint=True # 是否在数据库中创建约束

2.1K00

Django相关知识点回顾

__tablename__ = '' django中定义模型类: class 模型类名(models.Model): # 字段名 = models.字段类型(选项参数) ......class Meta: db_table = '' 定义属性: # 表中外字段名格式: hbook = models.ForeignKey('BookInfo...() # 由多查1 多对象.属性 例:hero.hbook 2.通过模型类进行关联查询 # 查图书(一) 一类.objects.get|filter(多类名__字段__条件=值) 例:books =...BookInfo.objects.filter(heroinfo__hcomment__contains='八') # 查英雄(多) 多类.objects.filter(属性__字段__条件=值)...查询结果缓存 使用同一个查询集时,只有在第一次使用查询集时会进行数据库查询操作,然后Django框架就会把查询结果存起来,下一次再使用这个查询集时,使用Django之前存储结果。

10K51

django 1.8 官方文档翻译:2-1-1 模型语法

,要显式指定并关联到多对多关系涉及模型。...中介模型有一些限制: 中介模型必须有且只有一个到源模型(上面例子中Group),或者你必须使用ManyToManyField.through_fields 显式指定Django 应该使用。...如果你模型中存在超个一个,并且through_fields没有指定,将会触发一个无效错误。 对目标模型有相同限制(上面例子中 Person)。...对于通过中介模型与自己进行多对多关联模型,允许存在到同一模型两个,但它们将被作为多对多关联关系两个(不同)方面。...Changed in Django 1.7: 在Django 1.6 及之前版本中,中介模型禁止包含多于一个

4.9K20

Django分组聚合查询实例分享

....publish=publish|publish_id=publish.id) 删: 默认存在级联删除 改: book修改一定存在 多对多: 关系表获取(book(主键) and author...high_price 50; 聚合查询—基于ORM 聚合函数使用场景: 单独使用:不分组,只查聚合结果 分组使用: 按字段分组,可查分组字段聚合结果 导入聚合函数: from django.db.models...ForeignKey(): 字段 to= 关联模型类 (一对多) to_file = 关联字段,省略默认关联主键 on_delete (关联数据被删除时操作) models.CASCADE...OneToOneField(): 一对一字段 3, ManyToManyField() :多对多关系 to = 关联模型类 through=关联关系类 through_fields关联关系表中...__name’)) 断开关联— 多对多自动创建关系表 # 断开关联(db_constraint属性)多对多自动创建关系表 (book() and author) # 断开后依然支持Django

1.8K10

django中related_name用法说明

下面我们根据上面的小情节定义两个模型,分别是买主模型以及水果模型,一个买主对应多个水果模型,简单一对多模型: class Buyer(models.Model): name = models.CharField...fruits = buyer.fruit_set.all() """ django 默认每个主表对象都有一个是属性,可以通过它来查询到所有属于主表子表信息。...这个属性名称默认是以子表名称小写加上_set()来表示,这里我们主表是buyer,字表是fruit,所以主表属性就是fruit_set """ 上面的fruit_set是django为对象buyer...而related_name就实现这个功能,在字表中定义时,增加related_name字段指定这个字表在主表中对应属性, 如下: class Fruit(models.Model): buyer...='buyer_fruit' """ 那么我们就可以通过自定义方式找到需要信息了: #首先获得水果模型中外键指向表中对象: buyer = Buyer.objects.filter(age =

2.3K20
领券