预取查询集不能使用值

时间:2019-02-05 17:39:30

标签: python django orm

我想进行以下查询以获取具有以下特征的查询集:

  1. 预先过滤
  2. 按名称分组
  3. 对内部数据求和

在我的代码中,我有:

q = DatiBanca.objects\
   .filter(is_negativo=False)\
   .values("istituto_credito__name")\
   .order_by("istituto_credito__name")

anagrafiche = anagrafiche.prefetch_related(
   Prefetch('dati__banche', queryset=q)
)

数据集JSON:

"dataset": {
    "id": 40,
    "banche": [
        {
        "id": 18396,
        "name": "Pippo",
        "importo": "10",
        "istituto_credito": 3,
        "is_negativo": false
        },
        {
        "id": 18397,
        "name": "Pippo",
        "importo": "20",
        "istituto_credito": 3,
        "is_negativo": false
        },
        {
        "id": 18398,
        "name": "Pippo",
        "importo": "999999999999",
        "istituto_credito": 3,
        "is_negativo": true
        },
        {
        "id": 16519,
        "name": "Pluto",
        "importo": "40",
        "istituto_credito": 5,
        "is_negativo": false
        },
        {
        "id": 13967,
        "name": "Paperino",
        "importo": "50",
        "istituto_credito": 4,
        "is_negativo": false
        }
    ]
}

此查询给我以下错误:

“预取查询集不能使用values()。”

如何从数据集中获得以下结果?

"dataset": {
    "id": 40,
    "banche": [
        {
        "name": "Pippo",
        "importo": "30",
        "istituto_credito": 3,
        "is_negativo": false
        }
        {
        "name": "Pluto",
        "importo": "40",
        "istituto_credito": 5,
        "is_negativo": false
        },
        {
        "name": "Paperino",
        "importo": "50",
        "istituto_credito": 4,
        "is_negativo": false
        }
    ]
}

this example: How to combine django “prefetch_related” and “values” methods? 不要使用“预取”功能并将结果限制为一个字段。我想对Anagrafica的子查询集进行分组操作

我用 django 2.1.5

1 个答案:

答案 0 :(得分:0)

您可以只删除原始查询上的values()调用,如下所示:

q = DatiBanca.objects\
   .filter(is_negativo=False)\
   .order_by("istituto_credito__name")

anagrafiche = anagrafiche.prefetch_related(
   Prefetch('dati__banche', queryset=q)
)

现在anagrafiche中的每个对象都是一个DatiBlanca对象,其中预取了DatiBlanca.dati.banche。然后,您可以稍后在此查询集中列出DatiBlanca.istituto_credito.name的值。