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}]