django获取content_set最大数量的元素

时间:2015-05-13 19:10:51

标签: django django-models foreign-keys foreign-key-relationship

我正在尝试进行反向键查询。查询是这样的:具有最大数量条的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个'条形','foo3'有2个'条形',而'foo1'只有一个'条形'

我想要的结果是一个列表,其中包含最大数量的条形图和像这样的条形数量:

[{'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的列表,就像我之前说过的那样。我还在努力,但正如我说它让我疯狂,我从昨天开始坚持下去。任何帮助,我会非常感激!!

1 个答案:

答案 0 :(得分:1)

您是否尝试使用Count对整个查询集进行注释,然后将值作为列表返回?

foo_objects = Foo.objects.all().annotate(
    qty_of_bars=Count('bar')).order_by('-qty_of_bars').values(
    'name', 'qty_of_bars')

这将返回一个列表,例如:

[{'name': u'Foo1', 'qty_of_bars': 3}, {'name': u'Foo2', 'qty_of_bars': 2}]

给定一个app模块名称' 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}]