首页 > 解决方案 > django:带有查询集值的选择显示

问题描述

我想在模板上使用 get_status_display,来自一个只有模型中一些字段的查询集。

我有一个带有选择字段(状态)的模型。

class Operation(models.Model, ModelMixin):
    operation_area = models.ForeignKey('operations.OperationArea', null=True)

    created = models.DateTimeField(auto_now=True)
    indication = models.NullBooleanField()
    observation = models.TextField(blank=True, null=True)
    rate = models.IntegerField(blank=True, null=True)
    scheduling = models.DateTimeField(blank=True, null=True)
    status = models.IntegerField(choices=OPERATION_TYPE)

class OperationArea(models.Model, ModelMixin):
    campaign = models.ForeignKey('campaigns.Campaign')
    person = models.ForeignKey('registrations.Person')
    user = models.ForeignKey('authentication.User')

    area = models.CharField(max_length=1, choices=OPERATION_AREA)

我的查询是:

Operation.objects.filter(operation_area__user=user).values('id', 'created', 'operation_area__person__name', 'status')

从这里得到一个字典,但 get_FOO_dislpay 是一个实例方法,不适用于字典。我不想使用 .only() 因为他带来了operation_area对象并获取person.name他进行了另一个查询,例如operation.operation_area.person.name。任何想法如何处理一个查询和 get_FOO_display?

标签: pythondjangodjango-templatesdjango-querysetchoicefield

解决方案


我认为annotate()是你要找的。

使用提供的查询表达式列表注释 QuerySet 中的每个对象。表达式可以是一个简单的值、对模型(或任何相关模型)上字段的引用,或者是对与模型中的对象相关的对象进行计算的聚合表达式(平均值、总和等)。查询集。

annotate() 的每个参数都是一个注释,将添加到返回的 QuerySet 中的每个对象。

Django 提供的聚合函数在下面的聚合函数中描述。

使用关键字参数指定的注释将使用关键字作为注释的别名。匿名参数将根据聚合函数的名称和正在聚合的模型字段为它们生成一个别名。只有引用单个字段的聚合表达式可以是匿名参数。其他一切都必须是关键字参数。

你应该使用:

operations.annotate(person_name=F('operation_area__person__name')) 

看看https://docs.djangoproject.com/en/2.0/ref/models/querysets/#annotate


推荐阅读