django 获取最大数量 content_set 的元素
django get elements with biggest qty of content_set
我正在尝试进行反向键查询。查询是这样的:bar数量最多的foo元素。
Foo:
name = models.CharField('name', max_length=255)
Bar:
name = models.CharField('name', max_length=255)
foo = models.ForeignKey(Foo)
foo_1.name = foo1
foo_2.name = foo2
foo_3.name = foo3
bar_1.name = bar1
bar_1.foo = foo1
bar_2.name = bar2
bar_2.foo = foo2
bar_3.name = bar3
bar_3.foo = foo2
bar_4.name = bar4
bar_4.foo = foo3
bar_4.name = bar4
bar_4.foo = foo3
'Foo2'有2个'bars','foo3'有2个'bars',而'foo1'只有一个'bar'
我想要的结果是一个列表,其中包含具有最大数量柱状图的 foos 和这样的柱状图数量:
[{'foo': foo2, 'qty_of_bars': 2}, {'foo': foo3, 'qty_of_bars': 3}]
我已经尝试了很多东西,例如:
foos = Foo.objects.all()
foos_with_biggest_qty_of_bar = foo.annotate(bar_count=Count('bar')).order_by(
'-bar_count').first()
这只给出了一个 foo,即柱数最多的那个,例如 'foo3',但可能不止一个。在上面的例子中有 2,foo2 和 foo3。
我试过这个:
foos_with_biggest_qty_of_bar = foo.annotate(bar_count=Count('bar')).order_by(
'-bar_count').first()
这给了我与单个 foo 相关的最大数量的柱状图
biggest_qty_of_bars = bars.objects.filter(foo=foos_with_biggest_qty_of_bar ).count()
foos_with_biggest_qty_of_bars = Foo.objects.all().annotate(total_bars=biggest_qty_of_bars )
最后一行没用,我得到:
'int' object has no attribute 'lookup'
我用 for 循环尝试了其他事情(这太糟糕了,非常丑陋,对此深表歉意,这是一次绝望的尝试,这让我发疯):
qyt_of_bars_of_each_foo = Foo.object.values('name').annotate(
count_bar=Count('bar'))
biggest_number = 0
foo_with_biggest_number_of_bar = []
for qty_of_bar_of_foo in qyt_of_bars_of_each_foo :
if qyt_of_bars_of_each_foo ['count_bar'] >= biggest_number :
foo_with_biggest_number_of_bar .append(qty_of_bar_of_foo)
biggest_number = qyt_of_bars_of_each_foo ['count_bar']
没有什么能给我我想要的结果,就像我之前说的那样,这是一个列表,其中包含具有最大数量的条和数量的 foos。我仍在尝试,但正如我所说,这让我发疯,从昨天开始我就坚持了下来。任何帮助我将不胜感激!!
您是否尝试过使用 Count 对整个查询集进行注释,然后 return 将值作为列表?
foo_objects = Foo.objects.all().annotate(
qty_of_bars=Count('bar')).order_by('-qty_of_bars').values(
'name', 'qty_of_bars')
这将是 return 一个列表,例如:
[{'name': u'Foo1', 'qty_of_bars': 3}, {'name': u'Foo2', 'qty_of_bars': 2}]
给定应用程序模块名称 'foo' 和以下夹具数据:
[{
"fields": {
"name": "Foo1"
},
"model": "foo.foo",
"pk": 1
}, {
"fields": {
"name": "Foo2"
},
"model": "foo.foo",
"pk": 2
}, {
"fields": {
"foo": 1,
"name": "Bar1-1"
},
"model": "foo.bar",
"pk": 1
}, {
"fields": {
"foo": 1,
"name": "Bar2-1"
},
"model": "foo.bar",
"pk": 2
}, {
"fields": {
"foo": 1,
"name": "Bar3-1"
},
"model": "foo.bar",
"pk": 3
}, {
"fields": {
"foo": 2,
"name": "Bar1-2"
},
"model": "foo.bar",
"pk": 4
}, {
"fields": {
"foo": 2,
"name": "Bar2-2"
},
"model": "foo.bar",
"pk": 5
}]
更新
如果您需要获取 qt_of_bars
大于 1 的值,您可以通过列表理解轻松获取这些值,因为您无法通过 ORM 在带注释的字段上进行过滤:
foo_objects = [{'foo': f, 'qty_of_bars': f.qty_of_bars}
for f in Foo.objects.all().annotate(
qty_of_bars=Count('bar')).order_by(
'-qty_of_bars') if f.qty_of_bars > 1]
[{'foo': <Foo: Foo1>, 'qty_of_bars': 3}, {'foo': <Foo: Foo2>, 'qty_of_bars': 2}]
我正在尝试进行反向键查询。查询是这样的:bar数量最多的foo元素。
Foo:
name = models.CharField('name', max_length=255)
Bar:
name = models.CharField('name', max_length=255)
foo = models.ForeignKey(Foo)
foo_1.name = foo1
foo_2.name = foo2
foo_3.name = foo3
bar_1.name = bar1
bar_1.foo = foo1
bar_2.name = bar2
bar_2.foo = foo2
bar_3.name = bar3
bar_3.foo = foo2
bar_4.name = bar4
bar_4.foo = foo3
bar_4.name = bar4
bar_4.foo = foo3
'Foo2'有2个'bars','foo3'有2个'bars',而'foo1'只有一个'bar'
我想要的结果是一个列表,其中包含具有最大数量柱状图的 foos 和这样的柱状图数量:
[{'foo': foo2, 'qty_of_bars': 2}, {'foo': foo3, 'qty_of_bars': 3}]
我已经尝试了很多东西,例如:
foos = Foo.objects.all()
foos_with_biggest_qty_of_bar = foo.annotate(bar_count=Count('bar')).order_by(
'-bar_count').first()
这只给出了一个 foo,即柱数最多的那个,例如 'foo3',但可能不止一个。在上面的例子中有 2,foo2 和 foo3。
我试过这个:
foos_with_biggest_qty_of_bar = foo.annotate(bar_count=Count('bar')).order_by(
'-bar_count').first()
这给了我与单个 foo 相关的最大数量的柱状图
biggest_qty_of_bars = bars.objects.filter(foo=foos_with_biggest_qty_of_bar ).count()
foos_with_biggest_qty_of_bars = Foo.objects.all().annotate(total_bars=biggest_qty_of_bars )
最后一行没用,我得到:
'int' object has no attribute 'lookup'
我用 for 循环尝试了其他事情(这太糟糕了,非常丑陋,对此深表歉意,这是一次绝望的尝试,这让我发疯):
qyt_of_bars_of_each_foo = Foo.object.values('name').annotate(
count_bar=Count('bar'))
biggest_number = 0
foo_with_biggest_number_of_bar = []
for qty_of_bar_of_foo in qyt_of_bars_of_each_foo :
if qyt_of_bars_of_each_foo ['count_bar'] >= biggest_number :
foo_with_biggest_number_of_bar .append(qty_of_bar_of_foo)
biggest_number = qyt_of_bars_of_each_foo ['count_bar']
没有什么能给我我想要的结果,就像我之前说的那样,这是一个列表,其中包含具有最大数量的条和数量的 foos。我仍在尝试,但正如我所说,这让我发疯,从昨天开始我就坚持了下来。任何帮助我将不胜感激!!
您是否尝试过使用 Count 对整个查询集进行注释,然后 return 将值作为列表?
foo_objects = Foo.objects.all().annotate(
qty_of_bars=Count('bar')).order_by('-qty_of_bars').values(
'name', 'qty_of_bars')
这将是 return 一个列表,例如:
[{'name': u'Foo1', 'qty_of_bars': 3}, {'name': u'Foo2', 'qty_of_bars': 2}]
给定应用程序模块名称 'foo' 和以下夹具数据:
[{
"fields": {
"name": "Foo1"
},
"model": "foo.foo",
"pk": 1
}, {
"fields": {
"name": "Foo2"
},
"model": "foo.foo",
"pk": 2
}, {
"fields": {
"foo": 1,
"name": "Bar1-1"
},
"model": "foo.bar",
"pk": 1
}, {
"fields": {
"foo": 1,
"name": "Bar2-1"
},
"model": "foo.bar",
"pk": 2
}, {
"fields": {
"foo": 1,
"name": "Bar3-1"
},
"model": "foo.bar",
"pk": 3
}, {
"fields": {
"foo": 2,
"name": "Bar1-2"
},
"model": "foo.bar",
"pk": 4
}, {
"fields": {
"foo": 2,
"name": "Bar2-2"
},
"model": "foo.bar",
"pk": 5
}]
更新
如果您需要获取 qt_of_bars
大于 1 的值,您可以通过列表理解轻松获取这些值,因为您无法通过 ORM 在带注释的字段上进行过滤:
foo_objects = [{'foo': f, 'qty_of_bars': f.qty_of_bars}
for f in Foo.objects.all().annotate(
qty_of_bars=Count('bar')).order_by(
'-qty_of_bars') if f.qty_of_bars > 1]
[{'foo': <Foo: Foo1>, 'qty_of_bars': 3}, {'foo': <Foo: Foo2>, 'qty_of_bars': 2}]