django:具有查询集值的选择显示

时间:2018-07-28 15:20:37

标签: python django django-templates django-queryset choicefield

我想在一个查询集中仅使用模型中某些字段的模板上使用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吗?

2 个答案:

答案 0 :(得分:0)

我认为 annotate()是您想要的。

  

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

     

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

     

下面的“聚合函数”中介绍了Django提供的聚合函数。

     

使用关键字参数指定的注释将使用关键字作为注释的别名。匿名参数将基于聚合函数的名称和要聚合的模型字段为其生成别名。只有引用单个字段的聚合表达式才可以是匿名参数。其他所有内容都必须是关键字参数。

您应该使用:

SettingSection

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

答案 1 :(得分:0)

我知道现在答复已经太晚了。不过,我认为我的解决方案值得分享:

def display_value(choices,field):
    options = [
         When(**{field: k, 'then': Value(v) })
          for k,v in choices
    ]
    return Case(
        *options,output_field=CharField()
    )

您可以使用:

my_field = {'field_value': display_value(CHOICES, 'field'),}
YourModel.objects.annotate(**my_field)